2016-08-15 79 views
1

我想獲得一個屬性列表中的屬性標記爲裝飾器[忽略](SQLite.Net),雖然我相信這個問題適用於任何裝飾者。使用反射來識別給定的裝飾器的屬性

var ignored = typeof(T) 
      .GetType() 
      .GetProperties().Where(p => 
       p.GetCustomAttributes<SQLite.Net.Attributes.IgnoreAttribute>()) 
      .ToList(); 

我已經試過各種組合的這一點 - 這裏的一個甚至不進行編譯,但訪問p.CustomAttributes集合做;但是,它不返回正確的屬性。爲了完整起見,這裏是T中的屬性:

private ProductCategory _category; 

[Ignore] 
public ProductCategory Category 
{ 
    get { return _category; } 
    set 
... 

請有人能指出我朝着正確的方向 - 是CustomAttributes甚至在正確的地方,以尋找嗎?

回答

2

您的代碼示例有兩個主要問題 -

首先的typeof(T)返回一個類型,所以你不需要調用它的GetType()(這樣做返回關於類型類信息,而不是返回關於「T」的信息)。

第二個問題是,你不能只是在Where lambda中調用「p.GetCustomAttributes(whatever)」,因爲這不會導致布爾結果,你需要調用「p.GetCustomAttributes(whatever)」。任何()」。

由於GetCustomAttributes調用中的泛型類型參數,您的代碼也未在我的計算機上編譯..但我確定過去我已經這麼做了!也許我正在使用不同版本的框架或其他東西。

該做的工作對我來說,代碼如下:

var ignored = typeof(T) 
    .GetProperties() 
    .Where(p => p.GetCustomAttributes(typeof(IgnoreAttribute), inherit: true).Any()) 
    .ToList(); 

(不管你是否需要「繼承:真正的」取決於你的對象模型,但我懷疑它是適當的在大多數情況下) 。