2012-01-07 34 views
8

üzerine özelliğin varlığını kontrol edin:C# - Ben aşağıdaki gibi bir durum var Enum en eleman

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

Ben OldProtocolAttribute belirlenmiş olduğu elemanlardan oluşan bir dizi elde etmek gerekir. Ben Attribute.IsDefined() yöntemi ve aşırı yükler görünüşte durum bu tür desteklemez fark ettik.

Sorum şu: solüsyon typeof(Header).GetField() herhangi bir yerindeki kullanmadan sorunu çözmek için bir yol

  • var mı? Değilse, bunu çözmek için en uygun yolu nedir
  • var?

cevap

14

Bildiğim kadarıyla farkındayım, sen tarladan niteliğini almak zorunda. , Sık sık bu gerekiyorsa Açıkçası

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(); 

iyi sonuçlar cache isteyebilirsiniz:

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

Ya bütün bir dizisini almak için: Sen kullanmayı tercih ediyorum.

+0

Mükemmel, teşekkürler! – user1098567

+0

@Jon Skeet, u ")" kaçırma ".Where (alanında => field.IsDefined (ÖzellikTürü, yanlış)" sonra - bu kod derlemek olmaz –

+0

@nuclearsweet: Sabit, teşekkürler.. –

4

Yansıma hemen hemen bu durumdaki tek araçtır. Sorgu çok kötü değil:

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