2012-01-16 11 views
0

私はxmlを解析し、そのxmlから指定された型のオブジェクトを作成するメソッドを持っています。 これは、すべてのタイプに共通のメソッドを持つように、ジェネリックを使用して行われます。クラスインスタンスのプロパティタイプを深く見つける

私の問題は、タイプ名(名前ではない)を使用してさまざまなクラスのプロパティを検索したいということです。私は、オブジェクトを作成する場合、私は、各インスタンスに対してtype1型付けされたプロパティにアクセスしたい、上記のすべての宣言されたクラスについて

class foo1 
{ 
    type1 prop1{get;set;} 
} 

class foo2 
{ 
    foo1 prop2{get;set;} 
} 

class foo3:foo2 
{ 
    type2 prop3{get;set;} 
} 

: は、プロパティは、クラス定義の一部が下に宣言され、その後タイプ「TYPE1」を持っているとしましょう上記のクラスはつまり、私は、foo2foo3クラスのオブジェクトからtype1と宣言されたプロパティの値を得ることができるはずです。私はクラスが増加するかもしれないので、これを行うための一般的な方法が本当に必要です。

答えて

1

ここにはへの片方があります。これはほぼです。欠けているのは、リフレクションを使用することです。BindingFlags.FlattenHierarchyは、親クラスのプライベートメソッドを返しません。これらのタイプを保護されたものとして公開すると、これが解決されます。

// using System.Reflection 

public IEnumerable<Type> GetTypesWithPropertyOfType(Assembly a, Type t) 
{ 
    BindingFlags propertyBindingFlags = BindingFlags.Public 
             | BindingFlags.NonPublic 
             | BindingFlags.Instance 
             | BindingFlags.FlattenHierarchy; 

    // a property is kept if it is assignable from the type 
    // parameter passed in    
    MemberFilter mf = (pi, crit)=> 
      (pi as PropertyInfo) 
      .PropertyType 
      .IsAssignableFrom(t); 

    // a class is kept if it contains at least one property that 
    // passes the property filter. All public and nonpublic properties of 
    // the class, and public and protected properties of the base class, 
    // are considered 
    Func<Type, bool> ClassFilter = 
     c=>c.FindMembers(MemberTypes.Property, propertyBindingFlags, mf, null) 
      .FirstOrDefault() != null; 

    // return all classes in the assembly that match ClassFilter 
    return 
     a.GetTypes() 
     .Where(c=>c.IsClass) 
     .Where(ClassFilter); 
} 
:(。あなたはまた、手動でトラバースベースクラスはプライベートメンバーを読み取ることができる)

あなたが与えられた型のプロパティを宣言アセンブリ内のすべてのタイプを見つけたい場合は、次のようなメソッドを書くことができ

定義する実行アセンブリ内のクラスを見つけるか、タイプtype1のプロパティを継承するには、コールがあります

var v = GetTypesWithPropertyOfType(
      Assembly.GetExecutingAssembly(), 
      typeof(type1)); 

    foreach (var n in v) Console.WriteLine(n.FullName); 

これは、foo1のを出力します。 FOOクラスを定義するコードがに改訂されている場合は(a)のfoo1.prop1は、パブリックまたは保護された作りと、(b)foo1からfoo2継承し、上記のコードを印刷します:予想通り

foo1 
foo2 
foo3 

を。

+0

「type1」のタイプのプロパティ値を取得するために上記のメソッドを変更するにはどうすればよいですか?私にお知らせください。私の意図は、クラスのインスタンスの値を取得することです。 – rinks

+0

ねえ、私は努力をするにはあまりにも多くの努力をしていると思うので、私は別の解決策(非反射アプローチ)を得ました。しかし、助けてくれてありがとう。 – rinks

関連する問題