2012-03-01 10 views
6

मैं सिर्फ सी # में Generics के साथ शुरू कर रहा हूँ, लेकिन एक समस्या में जल्दी पर, मैं कैसे कॉल कर सकते हैं एक सामान्य Enum पर .HasFlag() चलाने है?एक सामान्य enum के साथ HasFlag?

public class Example<TEnum> where TEnum : struct { 
} 

मैं [Flags] विशेषता कैसे जोड़ सकता हूं?

+0

संक्षेप में आप नहीं कर सकते: आप के बाद से प्रकार पैरामीटर एक मान प्रकार का प्रतिनिधित्व करने के लिए जाना जाता है, ValueType बजाय object के माध्यम से डाली सकता है। बाधाएं सामान्य मानकों पर विशेषताओं पर विचार नहीं करती हैं। आपको प्रतिबिंब के माध्यम से इसे लागू करना होगा। –

+1

टाइप पैरामीटर 'टी' से शुरू होना चाहिए; आपको 'जेनेरिकएनम' को 'तेनम' में बदलना चाहिए। – SLaks

+0

क्या आप एक उदाहरण @ एम। बाबाकॉक दे सकते हैं? और विधिवत उल्लेख किया, @SLaks – DevDave

उत्तर

6

उदाहरण विधि कॉलिंग वैसे भी मुक्केबाजी की आवश्यकता होगी, इसलिए, जब से तुम, Enum को विवश नहीं कर सकते सिर्फ जेनरिक का परित्याग और Enum का उपयोग करें। उदाहरण के लिए, के बजाय:

void Something(TEnum enumValue, TEnum flags) 
{ 
    if (enumValue.HasFlags(flags)) 
     //do something ... 
} 

यह करें:

void Something(Enum enumValue, Enum flags) 
{ 
    if (enumValue.HasFlags(flags)) 
     //do something ... 
} 

एक सामान्य विधि में, आप इस तरह अपने लक्ष्य को प्राप्त कर सकते हैं:

void Something(TEnum enumValue, TEnum flags) 
{ 
    Enum castValue = (Enum)(object)enumValue; 
    Enum castFlags = (Enum)(object)flags; 

    if (castValue.HasFlags(castFlags)) 
     //do something ... 
} 

इस क्रम में एक अपवाद फेंक होगा यदि आप विधि को उस मान प्रकार से कॉल करते हैं जो enum नहीं है। ,

Enum castValue = (Enum)(ValueType)enumValue; 
+0

मैं कर रहा था क्या आप शुरू में सुझाव दे रहे थे, लेकिन कई तरीके है कि एक में अपने उदाहरण का उपयोग करें कि एक सामान्य enum ले जाएगा refactor और अभी भी कॉल करने के लिए उस पर झंडे है – DevDave

+2

@Tyler दिखा रहा एक उदाहरण जोड़ा सक्षम होने के लिए कोशिश कर रहा हूँ कैसे कर सकते हैं 'एनम' के लिए एक सामान्य प्रकार पैरामीटर का उदाहरण डालें। – phoog

+0

धन्यवाद @phoog। मैं अभी भी इसे काम करने की कोशिश कर रहा हूं लेकिन ध्यान दिया है कि हैस्फ्लैग() विधि इंटेलिजेंस में दिखाई दी है! – DevDave

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