2012-01-07 59 views
8

對我有像下面這樣的情況:C# - 檢查屬性的存在枚舉的元素

enum Header 
{ 
    Sync, 
    [OldProtocol] Keepalive, 
    Ping, 
    [OldProtocol] Auth, 
    [OldProtocol] LoginData 
    //... 
} 

我需要獲得該OldProtocolAttribute定義元素的數組。我注意到Attribute.IsDefined()方法及其重載顯然不支持這種情況。

我的問題是:

  • 有沒有辦法解決這個問題,而不使用在溶液typeof(Header).GetField()的任何部分的方法嗎?
  • 如果不是,最好的解決方法是什麼?

回答

14

據我所知,你必須從現場獲得屬性。你會使用:

var field = typeof(Header).GetField(value.ToString()); 
var old = field.IsDefined(typeof(OldProtocolAttribute), false); 

或獲得整個數組:

var attributeType = typeof(OldProtocolAttribute); 
var array = typeof(Header).GetFields(BindingFlags.Public | 
            BindingFlags.Static) 
          .Where(field => field.IsDefined(attributeType, false)) 
          .Select(field => (Header) field.GetValue(null)) 
          .ToArray(); 

顯然,如果你需要這個時候,你可能想緩存結果。

+0

完美,謝謝! – user1098567 2012-01-07 17:09:36

+0

@Jon Skeet,u miss「)」after「.Where(field => field.IsDefined(attributeType,false))」 - 這段代碼不會編譯。 – 2014-10-29 14:48:45

+0

@nuclearsweet:修正,謝謝。 – 2014-10-29 16:06:04

4

反射幾乎是你唯一可用的工具。查詢不是太糟糕,但:

var oldFields = typeof(Header).GetFields(BindingFlags.Static | BindingFlags.Public).Select(field => Attribute.IsDefined(field, typeof(OldProtocolAttribute)));