2012-01-07 13 views
8

पर विशेषता के अस्तित्व के लिए जाँच करें मैं निम्नलिखित की तरह एक स्थिति मिल गया है:सी # - enum के तत्व

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

+0

@ जोन स्कीट, आप याद करते हैं ")" के बाद "। जहां (फ़ील्ड => फ़ील्ड। आईएस परिभाषित (विशेषता टाइप, झूठा)" - यह कोड संकलित नहीं होगा। –

+0

@nuclearsweet: फिक्स्ड, धन्यवाद। –

4

प्रतिबिंब इस के लिए उपलब्ध आपका एकमात्र टूल है। क्वेरी बहुत खराब नहीं है हालांकि:

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

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^