2012-01-16 70 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類型屬性的每個實例上述的類,即我應該能夠從foo1,foo2,foo3類的對象中獲得宣稱爲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)使從foo1foo2繼承,那麼上面的代碼打印:

foo1 
foo2 
foo3 

預期。

+0

如何修改上面的方法來獲取類型爲「type1」的屬性值。請告訴我。我的意圖是獲取任何類的實例的值。 – rinks 2012-01-17 05:04:34

+0

嘿我得到了另一個解決方案(非反射方法),因爲我認爲投入這些努力太多了。但感謝您的幫助。 – rinks 2012-01-18 10:54:03

相關問題