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

标签 c# .net reflection

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

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

请注意,您可能希望指定绑定(bind)标志以获取非公共(public)属性等。

关于c# - 如何使用反射确定属性类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/520400/

相关文章:

c# - 未知类型的动态,这还能如何实现?

c# - 如何通过构建配置名称而不是环境来管理AppSettings?

c# - Neo4j .NET 客户端执行字符串密码查询

powershell - 如何在PowerShell静态类方法中获取当前类名/对象?

Java 到 C# 的转换使用反射查找子类的公共(public)字段

java - Gradle 插件任务反射扫描插件的项目类文件而不是当前项目文件

c# - Csvhelper v22 不再有定居者?

c# - 从缓存对象转换 ValueTuple

c# - 有没有地方可以捕获所有信号器错误?

c# - 为什么我下载文件的代码会生成损坏的 PDF?