2012-12-22 26 views
8

新しい.NET Framework 4.5でリフレクションを使用して再生すると、予期しない動作が発生しました。名前空間System.Reflectionは、Typeオブジェクトを利用するためのいくつかの新しい拡張メソッドを提供します。そのうちの2つはGetRuntimeProperty(文字列名)とGetRuntimeProperties()です。Reflection:GetRuntimePropertyメソッドのフレームワークの動作が一貫していません

ここで、内部プロパティを持つ単純なオブジェクトがあるとします。

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プロパティdefintionsための2つのプロパティ定義を保持し、namePropertyは、Nameプロパティの定義を保持しています。期待していなかったのは、idPropertyオブジェクトがヌルであることでした。

.NET Frameworkから来ていますが、これはMicrosoftの設計者が意図したものだと思いますが、実際には起こりそうにないと思わなければなりません。私はそのような同様のメソッドが同じように動作する必要がありますが、GetRuntimePropertiesがフィルタを適用しないパブリックプロパティに対してGetRuntimePropertyフィルタを適用しているようです。

マイクロソフトでは、なぜこれらの類似のメソッドが異なる動作を持つべきであると判断したのかについて、合理的な説明をしていますか?設計ミス?

ありがとうございました。

+0

これは、ストアアプリでのみ使用する必要があります。あなたが見ているものは妥協です、IInspectableはまさに豊かなインターフェースではありません。 –

+0

彼らは完全に新しいリフレクションAPIを立ち上げました。それは私がどこから始めるべきかわからない、いろいろな意味での混乱です。 –

答えて

3

内部的にGetRuntimePropertyのパブリックプロパティを指定された名前で検索すると、Type.GetProperty(name)が呼び出されます。プロパティIdは保護されているため、見つからないことがあります。

一方
public static PropertyInfo GetRuntimeProperty(this Type type, string name) 
{ 
    CheckAndThrow(type); 
    return type.GetProperty(name); 
} 

GetRuntimeProperties戻り公共および非パブリックプロパティ

public static IEnumerable<PropertyInfo> GetRuntimeProperties(this Type type) 
{ 
    CheckAndThrow(type); 
    return type.GetProperties(BindingFlags.NonPublic | BindingFlags.Public | 
           BindingFlags.Static | BindingFlags.Instance); 
} 

Explanation:GetRuntimeProperties目的の両方がLINQを経由して、そのコレクションをフィルタリングして、あなたを残して、すべてのプロパティのIEnumerable<PropertyInfo>コレクションを返しています。パブリック、非公開、またはその他のタイプのプロパティを選択できます。 GetRuntimePropertyによって返される単一のプロパティでは、そのような柔軟性は必要ないため、ほとんどの一般的な使用法では制限されています。

+4

質問はこれです:これはこのように設計されています。あまり意味がない。私には設計ミスのようです。 – Steven

+0

@Stevenは言ったように、私は実際には内部的にこのようにコード化されていることを理解していますが、私が理解していないのは、それらのメソッドが異なる動作をする理由です。私は質問を明確にするように更新しました。ありがとう。 – Ucodia

+1

@Ucodia、Steven - 私は説明とリンクを追加しました。あなたが見ることができるように、それは設計上の決定です。非公開のプロパティが必要な場合は、LINQを使用して 'typeof(ObjectBase).GetRuntimeProperties()。Single(p => p.Name ==" Id ")' –

関連する問題