获取可应用于类的所有属性

时间:2014-05-23 17:39:03

标签: c# reflection attributes

如何确定是否可以使用反射将属性应用于类?

我目前正在使用反射来提取属性类型的集合,基本上是:

  • GetAssemblies
  • GetTypes
  • 其中基本类型的类型为Attribute

然后让构造函数获取每个可用的签名。

我只需要可以应用于类的属性,但不确定在何处使用反射查找使用定义。

2 个答案:

答案 0 :(得分:2)

您需要在Attribute类上获取AttributeUsageAttribute

你已经获得了所有的属性类型,所以你几乎就在那里。在每种类型上调用GetCustomAttributes()。如果属性类型没有使用属性,我相信它可以在任何地方使用。如果它具有使用属性,请阅读ValidOn property以查看其是否包含AttributeTargets.Class

var attributes = attributeType.GetCustomAttributes(typeof(AttributeUsageAttribute), true);
if(attributes.Length == 0 || (attributes.Length > 0 && ((AttributeUsageAttribute)attributes[0]).ValidOn & AttributeTargets.Class) != 0))
{
   //is class-valid attribute
}

答案 1 :(得分:0)

试试这个方法。您需要获取属性的属性。

public bool IsClassAttribute(Type attribute)
{
    object[] attributeUsage = attribute.GetCustomAttributes(typeof(AttributeUsageAttribute), true);
    if (attributeUsage == null || attributeUsage.Length <= 0) return false;
    AttributeUsageAttribute aua = attributeUsage[0] as AttributeUsageAttribute;
    return aua != null && (aua.ValidOn & AttributeTargets.Class) != 0;
}