2012-11-19 156 views
0

我想檢查是否有類型定義的[DataContract]屬性或繼承有它的實例定義檢查,如果類型具有或繼承具有一定屬性的類型

類型:

[DataContract] 
public class Base 
{ 
} 


public class Child : Base 
{ 
} 

// IsDefined(typeof(Child), typeof(DataContract)) should be true; 

的Attribute.IsDefined,並Attribute.GetCustomAttribute不看基類

任何人知道如何做到這一點不看基類的

回答

1

試試這個

public static bool IsDefined(Type t, Type attrType) 
{ 
    do { 
     if (t.GetCustomAttributes(attrType, true).Length > 0) { 
      return true; 
     } 
     t = t.BaseType; 
    } while (t != null); 
    return false; 
} 

我得到了這個念頭,因爲在您的評論的「遞歸」一詞的遞歸調用做出來。這是一個擴展方法

public static bool IsDefined(this Type t, Type attrType) 
{ 
    if (t == null) { 
     return false; 
    } 
    return 
     t.GetCustomAttributes(attrType, true).Length > 0 || 
     t.BaseType.IsDefined(attrType); 
} 

這樣稱呼它

typeof(Child).IsDefined(typeof(DataContractAttribute)) 
+0

優良的遞歸:) – Omu

+0

當然,如果你想檢查_interfaces_由類型實現,並且所有的基本接口遞歸地實現,但它稍微複雜一些。但是,我想,這超出了問題的範圍。 –

4

GetCustomAttribute()GetCustomAttributes(bool inherit)方法中存在一個超負荷方法,該方法使用布爾值來確定是否在繼承的類中執行搜索。但是,只有在您要搜索的屬性是使用[AttributeUsage(AttributeTargets.?, Inherited = true)]屬性定義的情況下才有效。

+0

+1,但我去掉'Customer'屬性:) –

相關問題