获取具有外部组件自定义属性的所有属性

问题描述 投票:0回答:1

我读过的主题:

如何获取具有给定属性的属性列表?

Reflection - 获取属性的属性名称和值


我创建了一个外部程序集(类库),并在其中定义了一个类和一个自定义属性:

namespace ClassLibrary1
{
    public class MyCustomAttribute:Attribute
    {
        public string Message { get; set; }
    }

    public class Class1
    {
        public int MyProperty0 { get; set; }

        [MyCustom(Message ="aaa")]
        public int MyProperty1 { get; set; }

        [MyCustom(Message = "bbb")]
        public int MyProperty2 { get; set; }
    
        public int MyProperty3 { get; set; }
    }
}

对于第一个目标,我想获取

MyCustomAttribute
的所有属性
Class1
,我编写了以下代码:

Assembly assembly = Assembly.LoadFile(<file path>);
var props = assembly.GetType("ClassLibrary1.Class1").GetProperties().Where(
prop => Attribute.IsDefined(prop, typeof(ClassLibrary1.MyCustomAttribute)));

但是它返回了

null
props
。我这样修改了代码:

PropertyInfo[] props = assembly.GetType("ClassLibrary1.Class1").GetProperties();
foreach (PropertyInfo prop in props)
{
    object[] attrs = prop.GetCustomAttributes(false);
    foreach (object attr in attrs)
    {
        var authAttr = attr as ClassLibrary1.MyCustomAttribute; <--------
        if (authAttr != null)
        {
            string propName = prop.Name;
            string message = authAttr.Message;

            Console.WriteLine($"{propName} ... {message }");
        }
    }
}

但指定行返回

null
attr
。但它实际上是
ClassLibrary1.MyCustomAttribute
的类型:

Get all properties with a custom attribute for external assembly

null

我不知道问题出在哪里。

c# reflection attributes
1个回答
0
投票

显然,代码中的类型名称

ClassLibrary1.MyCustomAttribute
并不代表您加载的程序集中声明的相同类型,即使它们具有相同的命名空间和简单名称。

您将使用

assembly.GetType
获得正确的类型,就像获得代表
Type
Class1
一样。

var props = assembly.GetType("ClassLibrary1.Class1").GetProperties().Where(
    prop => Attribute.IsDefined(prop, assembly.GetType("ClassLibrary1.MyCustomAttribute"))
);

要获得

Message
,请使用反射,

var attributeType = assembly.GetType("ClassLibrary1.MyCustomAttribute");
var messageProperty = attributeType.GetProperty("Message");
object[] attrs = prop.GetCustomAttributes(false);
foreach (object attr in attrs)
{
    if (attributeType.IsInstanceOfType(attr))
    {
        string propName = prop.Name;
        string message = messageProperty.GetValue(attr);

        Console.WriteLine($"{propName} ... {message }");
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.