這裏有一種方式來差不多做到這一點。缺少的是使用反射,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
預期。
來源
2012-01-16 11:10:14
drf
如何修改上面的方法來獲取類型爲「type1」的屬性值。請告訴我。我的意圖是獲取任何類的實例的值。 – rinks 2012-01-17 05:04:34
嘿我得到了另一個解決方案(非反射方法),因爲我認爲投入這些努力太多了。但感謝您的幫助。 – rinks 2012-01-18 10:54:03