新しい .NET Framework 4.5 でリフレクションをいじっていると、まったく予想外の奇妙な動作に遭遇しました。名前空間 System.Reflection は、Type オブジェクトを活用するためのいくつかの新しい拡張メソッドを提供します。そのうちの 2 つは、GetRuntimeProperty(string name) と GetRuntimeProperties() です。
ここで、内部プロパティを持つ単純なオブジェクトがあるとします。
public class ObjectBase
{
protected int Id { get; set; }
public string Name { get; set; }
}
そして、あなたは今、このタイプを悪用しようとしています。
var properties = typeof(ObjectBase).GetRuntimeProperties();
// properties.Count = 2
var idProperty = typeof(ObjectBase).GetRuntimeProperty("Id");
var nameProperty = typeof(ObjectBase).GetRuntimeProperty("Name");
// idProperty = null
// nameProperty = System.String Name
予想どおり、properties
オブジェクトは Id および Name プロパティ定義の 2 つのプロパティ定義を保持し、nameProperty は Name プロパティ定義を保持します。予想外だったのは、idProperty
オブジェクトがnullになることでした...
.NET Framework から来ているので、これはマイクロソフトのアーキテクトが意図したものだと思いますが、実際に起こるとは思えないことだと言わざるを得ません。このような同様のメソッドは同じように動作するはずですが、GetRuntimeProperty がフィルターを適用しないパブリック プロパティを GetRuntimeProperty フィルター処理しているようです。
Microsoft がこれらの同様のメソッドに異なる動作をさせるべきであると決定した理由について、合理的な説明を誰かが持っていますか? 設計ミス?
ありがとう。