2014-05-03 3 views
5

Ich muss mit .NET 3.5 arbeiten, möchte aber die TryParse-Methode verwenden, von der ich weiß, dass sie zu .NET 4.0 gehört. Dann suchte ich im Internet nach dem Thema und ich denke, ich fand die beste Lösung in [Simon Mouriers Antwort] (https://stackoverflow.com/a/6161718/1043198)!Wie TryParse für Enum-Wert in NET 3.5?

Also habe ich eine Klasse von meinem eigenen wie folgt

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 
    } 
} 

dann habe ich versucht, diese Klasse in einem neuen Projekt zu verwenden, wie folgt

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 
    } 

}  

aber ich kann nicht die richtige sintax bekommen für die Verwendung der "EnumTryParse" -Methode: Insbesondere scheint es, dass ich den ersten Parameter, der "Type type" sein muss, nicht korrekt übergeben kann.

Wie es herauskommt, bin ich ein totaler Neuling von C# und ich weiß sicher, dass ich etwas vermissen muss, das mich meinen Kopf schlagen lässt, sobald ich das richtige sintax bekommen werde. aber jetzt bin ich dran.

danken Ihnen für jede mögliche Hilfe

Antwort

5

Da die Fehlermeldung sagt, benötigen Sie den Typ passieren der Enumeration als erstes Argument. Sie müssen auch die Art der myValue ändern, um die out Parameter von EnumTryParse übereinstimmen, so:

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

Vielleicht haben Sie auch, mein Unconstrained Melody Projekt zu prüfen, die erlauben würde:

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

oder mit einem explicit type Argument:

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

Uneingeschränkte Melodie hat eine Reihe von generischen Methoden, einschließlich der Erweiterung Methoden, die all dies ohne das normalerweise involvierte Boxen und Casting ermöglichen.

+0

, die eine meiner tria war und Fehler – user3598756

+0

aber es gab mir zwei Fehler: 1) die besten überladene Methode Match für ‚ChojwaClasses.MyEnum.EnumTryParse (System.Type, Schnur, out object) 'hat ein ungültiges Argument s \t 2) Argument 3: kann nicht von 'out MyEnumerations.MyEnumeration' zu 'out object' konvertieren – user3598756

+0

@ user3598756: Richtig, das sagt dir, dass der Typ von 'myValue' falsch ist; Es muss vom Typ "Objekt" sein, um diese Methode zu verwenden. Es gibt Alternativen - vielleicht möchtest du dir mein Unconstrained Melody-Projekt ansehen: https://www.nuget.org/packages/UnconstrainedMelody/ –

1

Der letzte Parameter der EnumTryParse Methode ist out object, so das Argument, man muss von object Typ sein passiert, nicht MyEnumeration (weil ref und out Parameter sind unveränderlich). Da dies nicht sehr bequem ist, empfehle ich Ihnen die Methode generisch machen statt: kann

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; 
} 

Sie dann es so nennen:

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

(der generische Typparameter wird automatisch von der Art der zu entnehmen myValue, so müssen Sie es nicht angeben)

+0

ja es funktioniert. Danke. Jetzt möchte ich die Methode von Simon ändern, um dieses Muster wiederzugeben, d. H. "Out T-Wert" als letzten Parameter zu verwenden. seit Simons Methode scheint allgemeiner zu sein. Ich werde es versuchen. Wenn Sie irgendwelche Vorschläge haben, werde ich sie berücksichtigen. Danke nochmal – user3598756

+0

@ user3598756, was lässt dich glauben, dass Simons Antwort generischer ist? –

+0

nur seine Codelänge. – user3598756