2009-10-29 13 views
18

(ठीक है, मैं मेरी अज्ञानता की गहराई यहाँ का पर्दाफाश होगा, लेकिन कृपया कोमल होना)int करने के लिए प्रकार 'System.Enum' कनवर्ट नहीं कर सकता

पृष्ठभूमि

मैं एक विधि मिल गया है लग रहा है जो (थोड़ा) इस तरह:

public void AddLink(Enum enumVal) 
{ 
    string identifier = m_EnumInterpreter(enumVal); 
    AddLink(identifier); 
} 

EnumInterpreter> एक समारोह < Enum, स्ट्रिंग है कि जब माता पिता वर्ग बनाई गई है में पारित हो जाता है।

मैं एनम का उपयोग कर रहा हूं क्योंकि इस स्तर पर यह 'मेरा कोई भी व्यवसाय' नहीं है- मुझे परवाह नहीं है कि यह कौन सा विशिष्ट enum है। कॉलिंग कोड जादू तारों से बचने के लिए सिर्फ एक (जेनरेटेड) enum का उपयोग करता है।

प्रश्न

EnumInterpreter वापस भेजता है तो एक खाली स्ट्रिंग, मैं enumVal के वास्तविक मूल्य के साथ एक अपवाद फेंक करना चाहते हैं। मैंने सोचा कि मैं सिर्फ int में डालने में सक्षम हूं, लेकिन यह कंपाइलर नहीं होगा। मैं क्या गलत कर रहा हूं? (कृपया 'सब कुछ' मत कहो)।

+1

संभावित डुप्लिकेट [सिस्टम से कैसे परिवर्तित करें। एनम से आधार पूर्णांक?] (Http://stackoverflow.com/questions/908543/how-to-convert-from-system-enum-to-base-integer) – nawfal

उत्तर

5

नहीं, आप इसे एक int में डालने में सक्षम नहीं हैं क्योंकि सिस्टम। ईनम एक enum नहीं है, यह सिर्फ enums के लिए आधार वर्ग है।

संपादित करें:

इस प्रकार आप मूल्य प्राप्त कर सकते हैं, लेकिन यह बदसूरत है:

int intVar = (int)enuYourEnum.GetType().GetField("value__").GetValue(objYourEnum); 
+7

यूप, वह बदसूरत है। – Benjol

+1

ध्यान दें कि यह असफल हो जाएगा यदि 'int' enum के अंतर्निहित प्रकार * नहीं है। –

+0

ठीक है, मुझे यह स्वीकार करना होगा कि यह नहीं है, यह एक संकेत है, लेकिन मुझे लगता है कि मुझे कुछ ऐसा मिला है जो मेरे लिए काम करता है ... – Benjol

33

System.Enum सीधे पूर्णांक में ढाला नहीं जा सकता है, लेकिन यह स्पष्ट रूप से IConvertible को लागू करता है, जिसका अर्थ है आप कर सकते हैं का उपयोग करें:

public void AddLink(Enum enumVal) 
{ 
    string identifier = m_EnumInterpreter(Convert.ToInt32(enumVal)); 
    AddLink(identifier); 
} 

ध्यान रखें कि यदि आपके Enum वास्तव में कुछ अन्य उपयोग कर रहा है (जैसे एक नाव के रूप में) एक पूर्णांक के बजाय, आप रूपांतरण पर गैर पूर्णांक डेटा खो देंगे ersion। या स्पष्ट रूप से जो कुछ भी आप से परिवर्तित कर रहे हैं (अगर यह जाना जाता है)

+7

सी # enums तैर नहीं सकते: http://msdn.microsoft.com/en- हमें/लाइब्रेरी/sbbt4032% 28VS.71% 29.aspx - ** प्रत्येक गणना प्रकार में अंतर्निहित प्रकार होता है, जो कि किसी भी अभिन्न प्रकार ** –

1

विभिन्न यहाँ चीजों के साथ Convert कॉल की जगह:

1) रयान का जवाब ठीक है, लेकिन ... मैं नहीं बल्कि करने के लिए नीचे Enum से होकर गुजरेगा enum दुभाषिया, ताकि आप पूरी कनवर्ट कर सकें। तो ... वहाँ। यदि आप जानते हैं कि आप केवल पूर्णांक आधारित enums का उपयोग कर रहे हैं, Convert.ToInt32() बस ठीक है। अन्यथा आप या तो प्रतिबिंब का उपयोग कर जोड़ना चाहते हैं या अन्य रूपांतरणों को आजमा सकते हैं/पकड़ सकते हैं।

2) आप Enum क्लास के सदस्यों का उपयोग करने पर भी विचार कर सकते हैं, जैसे .GetName(), .GetValue(), आदि। क्योंकि वे एनम प्रकार से स्वतंत्र परिभाषित नामों और मूल्यों से सीधे निपटते हैं।

3) तकनीकी रूप से मैं enum दुभाषिया के बाहर अपवाद फेंक नहीं सकता। यदि वह स्थिति आम तौर पर सत्य है, तो एनम दुभाषिया के अंदर से अपवाद फेंक दें, ताकि वर्ग के सभी उपयोग सत्यापन के लाभान्वित हों। या आप डुप्लिकेटिंग कोड समाप्त कर सकते हैं।

4) आपके पास अपने परिवर्तनीय नामकरण से सी ++/एमएफसी पृष्ठभूमि निर्णय लग रहा है। आप सी # शैली नामकरण सम्मेलनों में शामिल होना चाहते हैं, यह अन्य लोगों के कोड और पुस्तकालयों का उपयोग/पढ़ने के दौरान आपके जीवन को कम करेगा। नामकरण में सहायता के लिए एक अच्छा एडिन के लिए एमएस स्टाइलकॉप देखें।

+0

1 हो सकता है) यह वास्तव में संकेत है, लेकिन कुछ भी यह निर्धारित नहीं करता है। 2) EnumInterpreter का वर्तमान (केवल) कार्यान्वयन वास्तव में Enum.GetName() का उपयोग करता है, GetValue() मौजूद नहीं है। 3) यह देखते हुए कि EnumInterpreter को बाहर से/ओवरराइड किया जा सकता है, मैं बहुत भरोसा नहीं करना चाहता था। 4) मैं उस पृष्ठभूमि वाले लोगों के साथ काम करता हूं, और वे नामकरण सम्मेलन का फैसला करने के लिए मेरे यहां थे, लेकिन मैं आपका सुझाव देखूंगा। – Benjol

+0

हाँ, क्षमा करें, इसकी वास्तव में .GetValues ​​() –

1

मैं अपने प्रश्न में यह शामिल करने के लिए है कि क्या पता नहीं है, या एक जवाब के रूप। समस्या यह है कि यह जवाब नहीं है, लेकिन यह वह जवाब है जो मेरे लिए काम करता है।

throw new Exception("EnumInterpreter returns empty string for enumVal=" + enumVal); 
//EnumInterpreter returns empty string for enumVal=3720116125 

मैं वास्तव में मेरे सवाल में int करने के लिए सरल बनाया:

मैं क्या खोज की है, संयोग से कुछ और कोशिश करते हुए, कि अगर मैं सिर्फ एक स्ट्रिंग के अंत पर इसे wodge, मैं मैं क्या चाहते है , वास्तविक डेटा प्रकार uint है (इस विशेष उदाहरण में)। सौभाग्य से, यह देखते हुए कि मैं वास्तव में स्ट्रिंग चाहता था, मुझे इसके बारे में चिंता करने की ज़रूरत नहीं है।

मुझे यकीन है कि जो तीन अन्य उत्तर की 'सही', है नहीं कर रहा हूँ तो दूर वोट ...

-3

क्यों एक स्ट्रिंग के लिए enum पार्स और वास्तविक enum मान नहीं?

public enum MyEnum { Flower = 1, Tree = 2, Animal = 3 }; 

string name = MyEnum.Flower.ToString(); // returns "Flower" 

मुझे लगता है कि .ToString() बहिष्कृत हो गई है और मैं यह करने के लिए नया तरीका के बारे में यकीन नहीं है। मैंने सोचा होगा कि वास्तविक enum प्रतिनिधित्व int से अधिक उपयोगी होगा?

+1

क्योंकि प्रश्न में कोड के संदर्भ में, मुझे enum तक पहुंच नहीं है। – Benjol

+2

'टॉस्ट्रिंग()' का केवल एक अधिभार वास्तव में बहिष्कृत है - इंटेलिजेंस वास्तव में उस संबंध में काफी भ्रामक है। – tomfanning

+0

"स्ट्रिंग के लिए enum पार्स क्यों नहीं है और वास्तविक enum मान वापस?" - अंतर्निहित Int32 वास्तविक enum मान है। – bubbleking

4

इस कोशिश ..

m_EnumInterpreter ((int) (वस्तु) enumVal);

0

मैं समझता हूँ कि यह शायद अपने सटीक समस्या का समाधान नहीं है, लेकिन मैं सिर्फ मैं कैसे एक विशेष एपीआई मैं उपयोग कर रहा था के लिए इस हल पोस्ट करना चाहते हैं।

int result = (int) (ActualEnumType) MethodThatReturnsSystemEnumType(arg1, arg2); 

उम्मीद है कि किसी के लिए मदद की जाएगी। डबल कास्ट एफटीडब्ल्यू।

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