2009-06-30 10 views
22

मैं आदेश में इस संबंध के लिए में स्पष्ट सी # में एक enum के लिए एक स्ट्रिंग से के बीच डाली करना चाहते हैं:सी # स्पष्ट डाली स्ट्रिंग enum को

(MyEnum) Enum.Parse(typeof(MyEnum),stringValue) 

मैं एक स्पष्ट डाली ऑपरेटर में इस निर्वासित करना चाहते हैं , मैंने यह किया लेकिन काम नहीं किया:

public static explicit operator (MyEnum)(value stringValue){ 
    return (MyEnum) Enum.Parse(typeof(MyEnum),stringValue); 
} 

क्या आपको पता है कि सी # में .NET 3.5 का उपयोग करना संभव है?

उत्तर

29

एक कास्ट संभव नहीं है। मुद्दा यह है कि उपयोगकर्ता द्वारा परिभाषित रूपांतरण को संरचना या कक्षा घोषणा में संलग्न किया जाना चाहिए, और रूपांतरण संलग्न प्रकार से या उसके लिए होना चाहिए। इस प्रकार,

public static explicit operator MyEnum(string value) 

क्योंकि न तो MyEnum है और न ही string कभी संलग्न प्रकार हो सकता है असंभव है।

ECMA334 सी # कल्पना के प्रासंगिक अनुभाग 17.9.4 है:

एक रूपांतरण ऑपरेटर एक स्रोत के प्रकार, लक्ष्य प्रकार के लिए, रूपांतरण ऑपरेटर के पैरामीटर प्रकार से संकेत दिया, वापसी ने संकेत से धर्मान्तरित रूपांतरण ऑपरेटर का प्रकार। एक वर्ग या संरचना किसी स्रोत प्रकार एस से एक लक्ष्य प्रकार टी में रूपांतरण घोषित करने की अनुमति है, केवल तभी निम्नलिखित सभी सत्य हैं, जहां S0 और T0 पीछे हैं जो पीछे हटने से परिणाम हैं? एस और टी से संशोधक, यदि कोई हो,

एस 0 और टी 0 विभिन्न प्रकार हैं।

या तो एस 0 या टी 0 कक्षा या संरचना प्रकार है जिसमें ऑपरेटर घोषणा होती है।

न तो S0 और न ही T0 एक इंटरफ़ेस-प्रकार है।

उपयोगकर्ता परिभाषित रूपांतरण को छोड़कर, एक रूपांतरण एस से टी करने के लिए या टी एस

को

हालांकि मौजूद नहीं है, आप स्ट्रिंग वर्ग पर एक विस्तार विधि कर सकते हैं।

public static class StringExtensions { 
    public static T ConvertToEnum<T>(this string value) { 
     Contract.Requires(typeof(T).IsEnum); 
     Contract.Requires(value != null); 
     Contract.Requires(Enum.IsDefined(typeof(T), value)); 
     return (T)Enum.Parse(typeof(T), value); 
    } 
} 
+0

शानदार उत्तर! मुझे पता था कि मैंने इसे कहीं कहीं देखा था और यह याद नहीं आया कि इसे कैसे काम करना है। धन्यवाद! –

+0

ग्रेट एक्सटेंशन! कई बार लोग यह सुनिश्चित करना भूल जाते हैं कि मूल्य enum में परिभाषित किया गया है। – Gromer

+1

@Gromer मुझे लगता है कि यह उल्लेखनीय है कि नेट 4.0 ने उस कारण के लिए एक विधि जोड़ा 'Enum.TryParse() '। – Dan

9

क्या एक कास्ट ऑपरेटर का उपयोग करना आवश्यक है? एक अन्य विकल्प स्ट्रिंग के बाहर एक एक्सटेंशन विधि जोड़ना होगा:

public static class StringEnumConversion 
{ 
    public static T Convert<T>(this string str) 
    { 
     return (T)Enum.Parse(typeof(T), str); 
    } 
} 
0

आप जो भी चाहते हैं उसे प्राप्त करने के लिए आप "स्ट्रिंगवेल्यू" विशेषताओं का भी उपयोग कर सकते हैं।

इस प्रश्न को देखें: stackoverflow.com/questions/424366/c-string-enums, वहां बहुत सारी जानकारी है जो मदद कर सकती है।

चीयर्स

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