プロパティは public だけど set は private なクラスがあったとして
public class Test { public string Name { get; private set; } }
この Name プロパティに外から値を設定する場合、今までこのコードで問題無いと思ってました。
using System.Reflection; … Test instance = new Test(); typeof(Test).InvokeMember("Name", BindingFlags.Instance | BindingFlags.SetProperty | BindingFlags.NonPublic, null, instance, new object[] { "ABC" });
ところが、いざ試してみると MissingMethodException が発生するではないか、驚きの新事実!!
正解は、こちらのコードのようです。
using System.Reflection; … Test instance = new Test(); typeof(Test).InvokeMember("Name", BindingFlags.Instance | BindingFlags.SetProperty | BindingFlags.NonPublic | BindingFlags.Public, null, instance, new object[] { "ABC" });
BindingFlags 列挙体については、こちらを参考に MSDN BindingFlags 列挙体。
Instance | SetProperty | NonPublic ではダメでした、直感的にはいけそうな気がしたのに。
ちなみに、Instance | SetProperty | Public でもダメでした。NonPublic と Public 共に指定しないとダメみたいです。
※体験談なので正式なソース(情報元)を当たっていません。
set は private だけど、そもそも プロパティが public だから、両方指定しないとダメって事なのかな?
プロパティ自体を private にした場合は、Instance | SetProperty | NonPublic でアクセス可能でした。
余談:
PropertyInfo の場合は、Instance | Public で問題なく取得出来ますし、set にもアクセス出来ます。
using System.Reflection; … Test instance = new Test(); PropertyInfo pi = typeof(Test).GetProperty("Name", BindingFlags.Instance | BindingFlags.Public); pi.SetValue(instance, "ABC", null);