我读过的主题:
我创建了一个外部程序集(类库),并在其中定义了一个类和一个自定义属性:
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
的类型:
我不知道问题出在哪里。
显然,代码中的类型名称
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 }");
}
}