public な プロパティの private な set にリフレクションでアクセスする

プロパティは 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);