如何确定是否可以使用反射将属性应用于类?
我目前正在使用反射来提取属性类型的集合,基本上是:
GetAssemblies
GetTypes
Attribute
然后让构造函数获取每个可用的签名。
我只需要可以应用于类的属性,但不确定在何处使用反射查找使用定义。
答案 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;
}