2014-05-23 56 views
2

如何確定某個屬性是否可以應用於使用反射的類?獲取可應用於類的所有屬性

我使用反射,基本上目前拉動的屬性類型的集合:

  • GetAssemblies
  • GetTypes
  • 其中基本類型是Attribute

然後讓建設者以類型得到每個可用的簽名。

我只需要可以應用於類的屬性,但不知道在哪裏可以找到使用反射的用法定義。

+0

的可能重複[如何獲得通過反射一次調用這兩個字段和屬性?](http://stackoverflow.com/questions/12680341/how-to-get-both-fields-and-properties通過反射的單通電話) – Jeff

+0

這不必與字段和屬性。我試圖獲得屬性的用法..因爲一個屬性只能應用於一個方法,或只應用於一個類,或兩者。 – opdb

+0

點了。我猜想任何屬性都可以應用於任何類,它仍然會編譯。 – Jeff

回答

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 
} 
+0

好的,這是有道理的。感謝這個例子:) – opdb

+0

在這個答案中有太多'屬性'。我的頭開始受傷;) – Jeff

+2

@Jeff什麼,你沒有發現屬性AttributeAttribute屬性是直觀的歸因? –

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; 
}