当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何使用反射确定属性类型?》经验,为你挑选了2个好方法。

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

编辑:我的目标是检查程序集,以查看该程序集中的任何类型是否包含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')类型



1> Jon Skeet..:

你对什么类型感兴趣?方法/属性/事件等的返回类型?

如果是这样,我不认为有什么事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");

请注意,您可能希望指定绑定标志以获取非公共属性等.



2> BFree..:

好吧,也许我错过了一些愚蠢的东西,但不应该是:

if ( pi.PropertyType == typeof(MyType ))

???

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有