我如何测试类型的属性以查看它是否是指定的类型?
编辑:我的目标是检查程序集,以查看该程序集中的任何类型是否包含MyType属性(或从MyType继承).
这是我走下去的赛道......
AssemblyName n = new AssemblyName(); n.CodeBase = "file://" + dllName; Assembly a = AppDomain.CurrentDomain.Load(n); foreach (Type t in a.GetTypes()) foreach (PropertyInfo pi in t.GetProperties()) if ( pi.PropertyType is MyType ) // warning CS0184 Console.WriteLine("Found a property that is MyType");
这会编译警告CS0184:给定的表达式永远不是提供的('MyType')类型
你对什么类型感兴趣?方法/属性/事件等的返回类型?
如果是这样,我不认为有什么事MemberInfo
让你直接获得-你需要转换和使用MethodInfo.ReturnType
,PropertyInfo.PropertyType
,FieldInfo.FieldType
,EventInfo.EventHandlerType
和其他任何我忘了.(请记住,类型本身可以是成员.不确定你想要用它们做什么!)
编辑:如果您对特定类型是代表MyType还是某些子类感兴趣,请使用Type.IsAssignableFrom:
if (typeof(MyType).IsAssignableFrom(type))
编辑:现在我们知道你想要属性,这很容易 - 使用GetProperties而不是GetMembers.我喜欢用LINQ做反思:
var query = from type in assembly.GetTypes() from property in type.GetProperties() where typeof(MyType).IsAssignableFrom(property.PropertyType) select new { Type=type, Property=property }; foreach (var entry in query) { Console.WriteLine(entry); }
如果你不是LINQ的粉丝:
foreach (Type t in a.GetTypes()) foreach (PropertyInfo pi in t.GetProperties()) if (typeof(MyType).IsAssignableFrom(pi.PropertyType)) Console.WriteLine("Found a property that is MyType");
请注意,您可能希望指定绑定标志以获取非公共属性等.
好吧,也许我错过了一些愚蠢的东西,但不应该是:
if ( pi.PropertyType == typeof(MyType ))
???