2009-07-15 2 views
0

im Rücken von einem Benutzer passieren versucht, eine Liste von Zeichenketten steuern, die Teil eines ENUM sind, wie folgt aus:Wie erstelle ich eine Enumeration aus einer Zeichenfolgendarstellung? C#

<bni:products id="bnProducts" runat="server" ProductsList="First, Second, Third" /> 

und im Code behid etwas tun, wie folgt aus:

public enum MS 
    { 
     First = 1, 
     Second, 
     Third 
    }; 
    private MS[] _ProductList; 
    public MS[] ProductsList 
    { 
     get 
     { 
      return _ProductList; 
     } 
     set 
     { 
      _ProductList = how_to_turn_string_to_enum_list; 
     } 
    } 

Mein Problem ist, dass ich nicht weiß, wie man diese Zeichenfolge in eine Liste von enum umwandelt, also was sollte "how_to_turn_string_to_enum_list" sein? Oder kennen Sie eine bessere Möglichkeit, Enums in Benutzersteuerelementen zu verwenden? Ich möchte wirklich in der Lage sein, eine Liste zu übergeben, die ordentlich

Antwort

3

Enum.Parse die kanonische Weise ist eine Zeichenfolge zu analysieren eine ENUM zu erhalten:

MS ms = (MS) Enum.Parse(typeof(MS), "First"); 

aber Sie werden das tun müssen, Schnur, die sich teilt.

Ihre Eigenschaft ist jedoch vom Typ MS[] - die value Variable im Setter wird keine Zeichenfolge sein. Ich vermute, dass Sie Ihre Eigenschaft zu einer Zeichenfolge machen müssen, und analysieren Sie es dort, Speichern der Ergebnisse in einem MS[]. Zum Beispiel:

private MS[] products; 

public string ProductsList 
{ 
    get 
    { 
     return string.Join(", ", Array.ConvertAll(products, x => x.ToString())); 
    } 
    set 
    { 
     string[] names = value.Split(','); 
     products = names.Select(name => (MS) Enum.Parse(typeof(MS), name.Trim())) 
         .ToArray(); 
    } 
} 

ich weiß nicht, ob Sie das Array aussetzen müssen werde sich direkt - das hängt davon ab, was Sie versuchen zu tun.

+0

eh, Enum.Parse braucht einen Type, wenn ich mich nicht irre? MS ms = (MS) Enum.Parse (Typ von (MS), "First"); –

+0

Hoppla, danke :) –

+0

du hast Recht, es wäre eine Zeichenfolge, ich würde diese Antwort mit "280Z28" Antwort oben kombinieren, weil ich denke, die CovertAll ist elegent, danke – Ayyash

4

Sie müssen die System.Enum.Parse Methode betrachten.

+0

dieser "oder" s die Werte übergeben, nicht was ich suche – Ayyash

+0

Was meinst du genau? Natürlich konvertiert diese Methode nur einen einzelnen Wert in eine Enum, Sie müssen alle durchlaufen und die Methode auf jedes Element anwenden;) –

2
string[] stringValues = inputValue.Split(','); 

_ProductList = new MS[stringValues.Length]; 

for (int i=0;i< stringValues.Length;i++) 
    _ProductList[i] = (MS) Enum.Parse(typeof(MS), stringValues[i].Trim()); 

(mein Code aktualisiert, weil ich falsch verstanden Code)

6

Dies ist eine kurze Lösung, aber es deckt einige sehr wichtige Dinge wie Lokalisierung und ungültige Eingaben nicht ab.

+0

+1 für die Validierung. In diesem Beispiel ist die Lokalisierung kein großes Problem, da es sich nicht um vom Benutzer bereitgestellte Daten handelt, sondern um den Seitencode. –

0

Markieren Sie Ihre Enum mit dem [Flags] -Attribut und kombinieren Sie Flags anstelle eines Arrays von Enum-Werten.

+1

Das ist nicht immer gültig. Zum Beispiel sind HTTP-Antwortcodes keine * logischen * Flags - aber Sie könnten eine Sammlung von ihnen haben (z.B. "Ich handle mit diesen Antwortcodes"). Beeile dich nicht, Flags für Enums zu verwenden, die keine logischen Flags sind. –