如何使用反射确定属性类型?

2024-05-04

如何测试类型的属性以查看它是否是指定类型?

编辑:我的目标是检查程序集以查看该程序集中的任何类型是否包含 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 http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx:

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");

请注意,您可能想要指定绑定标志来获取非公共属性等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用反射确定属性类型? 的相关文章

随机推荐