2009-02-03 7 views
8

के रूप में एक से this question.C# Enum फ़ंक्शन पैरामीटर

पर का पालन करें मैं कैसे एक समारोह फोन और एक Enum में पारित कर सकते हैं?

उदाहरण के लिए मैं निम्नलिखित कोड है:

enum e1 
{ 
    //... 
} 

public void test() 
{ 
    myFunc(e1); 
} 

public void myFunc(Enum e) 
{ 
    var names = Enum.GetNames(e.GetType()); 

    foreach (var name in names) 
    { 
     // do something! 
    } 

} 

हालांकि जब मैं इस मैं हो रही है 'E1' एक 'प्रकार' है, लेकिन एक 'चर' त्रुटि संदेश की तरह प्रयोग किया जाता है है। मदद करने के लिए कोई विचार?

मैं किसी भी एनम पर काम करने के लिए सामान्य काम को रखने की कोशिश कर रहा हूं न केवल एक विशिष्ट प्रकार? क्या यह भी संभव है? ... एक सामान्य कार्य का उपयोग करने के बारे में कैसे? क्या यह काम करेगा?

+0

@TK, typesafe के लिए मेरी हाल ही में संपादित देखें:

तो, प्रकार सुरक्षा सुनिश्चित करने के लिए, आप अपने कार्य करने के लिए बदल सकते हैं। –

+0

मुझे एक स्पष्टीकरण चाहिए _why_ आप यह करना चाहते हैं। मेरे लिए ऐसा लगता है कि आप किसी ऐसी समस्या के समाधान को खोजने का प्रयास करते हैं जो मौजूद नहीं होगा यदि आप कुछ चरणों से अपने अपहरण पर पुनर्विचार करेंगे, तो स्पष्टीकरण वास्तविक समस्या के समाधान को खोजने में मदद कर सकता है। – dbemerlin

उत्तर

9

आप एक सामान्य समारोह का उपयोग कर सकते हैं:

public void myFunc<T>() 
    { 
     var names = Enum.GetNames(typeof(T)); 

     foreach (var name in names) 
     { 
      // do something! 
     } 
    } 

और कॉल की तरह:

myFunc<e1>(); 

(संपादित)

संकलक की शिकायत करता है, तो आप Enum या enum को T में रोके का प्रयास करें।

public static void myFunc<T>() 
    { 
     Type t = typeof(T); 
     if (!t.IsEnum) 
      throw new InvalidOperationException("Type is not Enum"); 

     var names = Enum.GetNames(t); 
     foreach (var name in names) 
     { 
      // do something! 
     } 
    } 
5

आप उस प्रकार का एक उदाहरण के रूप में enum के प्रकार के पारित करने के लिए कोशिश कर रहे हैं - कुछ इस तरह का प्रयास करें:

enum e1 
{ 
    foo, bar 
} 

public void test() 
{ 
    myFunc(e1.foo); // this needs to be e1.foo or e1.bar - not e1 itself 
} 

public void myFunc(Enum e) 
{ 
    foreach (string item in Enum.GetNames(e.GetType())) 
    { 
     // Print values 
    } 
} 
+0

मुझे पता है कि मैं इस तरह के व्यक्तिगत मूल्यों को छोड़ सकता हूं। मैं एक सामान्य कार्य को एक समारोह में पास करने के लिए देख रहा हूं ताकि सभी मूल्यों को प्रिंट न किया जा सके। –

+0

यह सभी मूल्यों को प्रिंट करेगा। Enum.GetNames (e.GetType()) का उपयोग करें। –

9

क्यों प्रकार गुजर नहीं? चाहते:

myfunc(typeof(e1)); 

public void myFunc(Type t) 
{ 
} 
+0

यदि मैं "if (e enum है)" या 'as' कथन का उपयोग करता हूं, तो मुझे एक संदर्भ रूपांतरण, बॉक्सिंग रूपांतरण, अनबॉक्सिंग रूपांतरण के माध्यम से "सिस्टम कन्वर्ट नहीं कर सकता" सिस्टम त्रुटि। सिस्टम 'एनीम' में एक त्रुटि प्राप्त होती है। रैपिंग रूपांतरण, या शून्य प्रकार रूपांतरण " –

+0

आप अभी भी Enum.GetNames (टी) –

+0

का उपयोग कर सकते हैं यह सुनिश्चित करने के लिए कि मैं किसी भी प्रकार के बजाय ऑनमी enums का उपयोग कैसे किया जा सकता है? –

0

उपयोग

public void myFunc(e1 e) { // use enum of type e} 
बजाय

public void myFunc(Enum e) { // use type enum. The same as class or interface. This is not generic! } 
+0

मैं किसी भी एनम पर काम करने के लिए जेनेरिक फ़ंक्शन को केवल एक विशिष्ट प्रकार के रूप में रखने की कोशिश नहीं कर रहा था? –