2014-05-03 8 views
5

मुझे .NET 3.5 के साथ काम करना है, लेकिन TryParse विधि का उपयोग करना चाहता हूं जो मुझे पता है .NET 4.0 से संबंधित है। फिर मैंने विषय के लिए वेब की खोज की और मुझे लगता है कि मुझे [साइमन मॉरीयर के उत्तर] में सबसे अच्छा समाधान मिला है (https://stackoverflow.com/a/6161718/1043198)!नेट 3.5 में एनम मूल्य के लिए प्रयास कैसे करें?

तो मैं अपने ही तरह का एक वर्ग इस प्रकार

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Globalization; 

namespace MyClasses 
{ 

    public class MyEnum 
    { 
    // here goes all of Simons's code 
    } 
} 

तो मैं जैसे

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using MyClasses; 

namespace MyEnumerations 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      Console.WriteLine("Type in a name: "); 
      string userValue = Console.ReadLine(); 

      MyEnumeration myValue; 

      if (MyEnum.EnumTryParse(myValue,userValue, out myValue)) 
      { 
       switch (myValue) 
       { 
        case MyEnumeration.Elem1: 
         Console.WriteLine("Elem1 caught!"); 
         break; 
        case MyEnumeration.Elem2: 
         Console.WriteLine("Elem2 caught"); 
         break; 
        case MyEnumeration.Elem3: 
         Console.WriteLine("Elem3 caught"); 
         break; 
        default: 
         Console.WriteLine("Does not compute"); 
         break; 
       } 
      } 

      Console.ReadLine(); 

     } 
    } 

    enum MyEnumeration 
    { 
     Elem1, 
     Elem2, 
     Elem3 
    } 

}  

इस प्रकार एक नई परियोजना में उस वर्ग का उपयोग करने की कोशिश की, लेकिन मैं उचित sintax नहीं मिल सकता है बनाया "EnumTryParse" विधि का उपयोग करने के लिए: विशेष रूप से ऐसा लगता है कि मैं पहले पैरामीटर को सही ढंग से पास नहीं कर सकता जो "टाइप टाइप" होना चाहिए।

जैसा कि यह आता है, मैं सी # की कुल नौसिखिया हूं और मुझे यकीन है कि मुझे कुछ याद आना चाहिए जो मुझे उचित सिंटैक्स प्राप्त करने के बाद मुझे अपने सिर को घुमाएगा। लेकिन अभी के लिए मैं इसके साथ अटक गया हूँ। त्रुटि संदेश कह रहा है के रूप में

किसी भी संभव मदद

उत्तर

5

के लिए धन्यवाद, आपको पहले तर्क के रूप में enum की प्रकार पारित करने के लिए की जरूरत है। तुम भी तो EnumTryParse की out पैरामीटर मैच के लिए myValue के प्रकार को बदलने की जरूरत,:

MyEnumeration myValue; 
if (Enums.TryParseName(userValue, out myValue)) 
{ 
    // Do stuff 
} 

या एक साथ:

object myValue; 
if (MyEnum.EnumTryParse(typeof(MyEnumeration), userValue, out myValue)) 
{ 
    MyEnumeration actualValue = (MyEnumeration) myValue; 
    ... 
} 

तुम भी मेरी Unconstrained Melody परियोजना है, जो की अनुमति होगी विचार करना चाह सकते स्पष्ट प्रकार तर्क:

MyEnumeration myValue; 
if (Enums.TryParseName<MyEnumeration>(userValue, out myValue)) 
{ 
    // Do stuff 
} 

अनगिनत मेलोडी में सामान्य तरीकों का एक समूह है, जिसमें विस्तार विधियों, जो यह सब मुक्केबाजी और कास्टिंग के बिना किया जाना चाहिए जो आम तौर पर शामिल है।

+0

कि मेरे tria और त्रुटियों – user3598756

+0

में से एक था, लेकिन यह मुझे दो त्रुटियों दे दी है की जरूरत नहीं है: 1) 'ChojwaClasses.MyEnum.EnumTryParse (System.Type, स्ट्रिंग के लिए सबसे अच्छा अतिभारित विधि मैच, आउट ऑब्जेक्ट) 'में कुछ अमान्य तर्क है एस \t 2) तर्क 3: 'आउट MyNnumerations.MyEnumeration' से 'ऑब्जेक्ट आउट' से कनवर्ट नहीं किया जा सकता – user3598756

+0

@ user3598756: ठीक है, यह आपको बता रहा है कि 'myValue' का प्रकार गलत है; उस विधि का उपयोग करने के लिए इसे 'ऑब्जेक्ट' टाइप करने की आवश्यकता है। विकल्प हैं - हो सकता है कि आप मेरी अनियंत्रित मेलोडी परियोजना को देखना चाहें: https://www.nuget.org/packages/UnconstrainedMelody/ –

1

EnumTryParse विधि के अंतिम पैरामीटर out object है, इसलिए तर्क आप पारित प्रकार object का होना चाहिए, नहीं MyEnumeration (ref क्योंकि और out मापदंडों अपरिवर्तनीय हैं)। चूंकि यह बहुत सुविधाजनक नहीं है, मैं तुम्हें विधि के बजाय सामान्य बनाने का सुझाव देते हैं:

public static bool EnumTryParse<T>(string s, out T value) 
{ 
    value = default(T); 
    if (Enum.IsDefined(typeof(T), s)) 
    { 
     value = (T)Enum.Parse(typeof(T), s); 
     return true; 
    } 
    return false; 
} 

फिर आप इसे इस तरह कॉल कर सकते हैं:

if (MyEnum.EnumTryParse(userValue, out myValue)) 

(सामान्य प्रकार पैरामीटर स्वचालित रूप से के प्रकार से अनुमान लगाया जाता है myValue, ताकि आप इसे निर्दिष्ट करने के लिए)

+0

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

+0

@ user3598756, आपको क्या लगता है कि साइमन का जवाब अधिक सामान्य है? –

+0

बस उसकी कोड लंबाई। – user3598756

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