2011-11-01 9 views
12

Fondamentalmente una serie di titoli passerà nell'istruzione switch e devo confrontarli con i valori stringa dell'enum. Ma ho poca o nessuna idea di come farlo correttamente.Come assegnare valori stringa a enumerazioni e utilizzare quel valore in uno switch

Inoltre, non so se questo è anche l'approccio migliore, quindi se qualcuno ha qualche idea?

Ad esempio:

enum 
{ 
    doctor = "doctor", 
    mr = "mr", 
    mrs = "mrs" 
} 

e quindi passare attraverso i valori di stringa li ho assegnato.

risposta

9

Non si può avere un enum con un tipo di fondo di string. The underlying type can be any integral type except char.

Se si desidera tradurre un string al vostro enum allora probabilmente necessario utilizzare le Parse o TryParse metodi.

string incoming = "doctor"; 

// throws an exception if the string can't be parsed as a TestEnum 
TestEnum foo = (TestEnum)Enum.Parse(typeof(TestEnum), incoming, true); 

// try to parse the string as a TestEnum without throwing an exception 
TestEnum bar; 
if (Enum.TryParse(incoming, true, out bar)) 
{ 
    // success 
} 
else 
{ 
    // the string isn't an element of TestEnum 
} 

// ... 

enum TestEnum 
{ 
    Doctor, Mr, Mrs 
} 
0

Leggere il this tutorial per capire come funzionano le enumerazioni. Esistono anche esempi di dichiarazioni switch.

+0

Mi sono sfogliato ma non ho visto nulla sull'assegnazione di valori stringa lì. – ediblecode

3

Le enumerazioni non possono essere di tipo stringa.

I tipi approvati per un enum sono byte, sbyte, short, ushort, int, uint, long o ulong.

http://msdn.microsoft.com/en-us/library/sbbt4032.aspx

+0

Non ho detto che volevo che fosse di tipo stringa. Ho detto che volevo assegnare un valore stringa ad esso. L'ho visto fare prima e volevo sapere come implementarlo. – ediblecode

+0

Le mie scuse allora, l'ho letto come la stessa cosa visto che i valori sottostanti sono il tipo di enum. – Jay

4

Questo non è il tipo di cosa che dovrebbe essere hardcoded. Dovrebbe essere basato sui dati, possibilmente letto da un file o database esterno. È possibile memorizzarli in un Dictionary e utilizzare i tasti per guidare la logica.

+0

Ho pensato così. Grazie – ediblecode

+0

Le descrizioni di enumerazione hard-coding non sono più errate delle classi di denominazione dopo gli oggetti del dominio reale. A volte un Fish.BabelFish sarà sempre un "pesce Babel". Si potrebbe fare un caso per ottenere i valori da una risorsa localizzata (per la globalizzazione), ma non è necessario ottenere ogni informazione da un database o da un file esterno. –

3

Enum può avere solo tipi di sottotitoli interi (eccetto char). Quindi non puoi fare ciò che vuoi, almeno direttamente.

Tuttavia è possibile tradurre la stringa è necessario il tipo enum:

EnumType eVal = (EnumType)Enum.Parse(typeof(EnumType), strValue); 

switch(eVal) 
{ 
    case EnumType.doctor:/*...*/; break; 
    case EnumType.mr: /*...*/; break; 
} 
1

Perché non usare solo enum pura e switch?

enum Prefix 
{ 
    doctor, 
    mr, 
    mrs 
} 

Quindi è possibile utilizzare è come

string case = "doctor"; 

switch ((Prefix)Enum.Parse(typeof(Prefix), "doctor")) 
{ 
    case Prefix.doctor: 
     ... 
     break; 
    ... 
    default: 
     break; 
} 
+0

enum deve essere una parola, quindi Lance Corporal, ad esempio, mi causerebbe problemi – ediblecode

+1

è possibile creare una mappa 'Dizionario mappa', riempirla, quindi data una stringa" Lance Corporal "trovare un valore enum appropriato (come 'Prefix p = map [" Lance Corporal "];') e fai un cambio sul tipo enum. –

2

Credo che il modo standard per farlo è quello di utilizzare una classe statica con le proprietà di stringa di sola lettura che restituiscono il valore che si desidera.

16

Ho trovato che il modo migliore per farlo è utilizzare l'attributo System.ComponentModel.Description sui valori enum.

Ecco un esempio:

using System.ComponentModel; 

public enum ActionCode 
{ 
    [Description("E")] 
    Edit, 
    [Description("D")] 
    Delete, 
    [Description("R")] 
    Restore 
} 

Quindi, per utilizzarlo, creare un metodo di estensione su una classe statica in questo modo:

Edit: ho riscritto il codice originale come un metodo di estensione generica su una classe che implementa IConvertible (Enum implementa questa interfaccia, quindi funziona come ne abbiamo bisogno). Ecco un metodo generico che funziona su tutti enumerazioni:

public static string GetDescription<T>(this T e) where T : IConvertible 
{ 
    if (e is Enum) 
    { 
     Type type = e.GetType(); 
     Array values = System.Enum.GetValues(type); 

     foreach (int val in values) 
     { 
      if (val == e.ToInt32(CultureInfo.InvariantCulture)) 
      { 
       var memInfo = type.GetMember(type.GetEnumName(val)); 
       var descriptionAttribute = memInfo[0] 
        .GetCustomAttributes(typeof(DescriptionAttribute), false) 
        .FirstOrDefault() as DescriptionAttribute; 

       if (descriptionAttribute != null) 
       { 
        return descriptionAttribute.Description; 
       } 
      } 
     } 
    } 

    return null; // could also return string.Empty 
} 

Quindi, per ottenere la stringa associata con la nostra enum sopra, potremmo utilizzare il seguente codice:

using Your.Extension.Method.Namespace; 

... 

ActionCode action = ActionCode.Edit; 
string actionDescription = action.GetDescription(); 

// value of actionDescription will be "E" 

Ecco un altro Enum campione:

public enum TestEnum 
{ 
    [Description("This is test 1")] 
    Test1, 
    [Description("This is test 2")] 
    Test2, 
    [Description("This is test 3")] 
    Test3 

} 

Ecco il codice per vedere la descrizione:

TestEnum test = TestEnum.Test2; 
var testDescription = test.GetDescription(); 

I risultati saranno:

"This is test 2" 

volevo andare avanti e inserisci il metodo generico in quanto è molto più utile. Ti impedisce di dover scrivere un'estensione personalizzata per tutte le tue enumerazioni.

+0

ottimo con dettagli in aumento – MonsterMMORPG

1

Desidero aggiungere un'altra risposta per chiunque usi C# 6 o successivo.

Se sei solo vogliono ottenere il nome del valore Enum, è possibile utilizzare il nuovo metodo nameof() introdotta in C# 6.

string enumName = nameof(MyEnum.EnumVal1); // enumName will equal "EnumVal1" 

Anche se questo può sembrare eccessivo a prima vista (perché non basta impostare il valore della stringa su "EnumVal1" per iniziare con?), ti darà un controllo in fase di compilazione per assicurarti che il valore sia valido. Quindi, se cambi mai il nome del valore enum e dimentichi di dire al tuo IDE di trovare e sostituire tutti i riferimenti, non verrà compilato finché non li risolvi.

Problemi correlati