2012-01-07 13 views
8

Tôi đã có một tình huống như sau:C# - Kiểm tra sự tồn tại thuộc tính về yếu tố enum của

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

tôi cần để có được một loạt các yếu tố trên mà OldProtocolAttribute được định nghĩa. Tôi đã nhận thấy rằng phương pháp Attribute.IsDefined() và quá tải của nó dường như không hỗ trợ loại tình huống này.

Câu hỏi của tôi là:

  • Có cách nào để giải quyết vấn đề mà không sử dụng trong bất kỳ một phần của giải pháp typeof(Header).GetField()?
  • Nếu không, cách tối ưu nhất để giải quyết nó là gì?

Trả lời

14

Theo như tôi biết, bạn phải lấy thuộc tính từ trường này. Bạn muốn sử dụng:

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

Hoặc để có được một mảng toàn:

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

Rõ ràng nếu bạn cần điều này thường xuyên, bạn cũng có thể muốn cache kết quả.

+0

Hoàn hảo, cảm ơn! – user1098567

+0

@Jon Skeet, u bỏ lỡ ")" sau "." Ở đây (trường => trường.Được xác định (thuộc tínhType, false) "- mã này sẽ không biên dịch. –

+0

@nuclearsweet: Cố định, cảm ơn. –

4

Phản ánh là công cụ duy nhất của bạn có sẵn cho việc này. Truy vấn không quá tệ mặc dù:

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