2013-04-16 18 views
13

Sto cercando di fare una funzione in cui possiamo ottenere il NameValue di un EnumValuePrendi il nome del valore di Enum

Ad esempio:

Get_Enum_ValueName(DayOfWeek, 0) 

... Questo restituirà "Domenica ".

Ma il mio codice non funziona, dice il tipo non è definito:

Private Function Get_Enum_ValueName(Of T)(ByVal EnumName As T, ByVal EnumValue As Integer) As String 
    Return DirectCast([Enum].Parse(GetType(EnumName), EnumValue), EnumName).ToString 
End Function 
+5

Perché non usare semplicemente 'EnumVariable.ToString'? – ppetrov

+0

Stai chiedendo in particolare la proprietà DateTime.DayOfWeek o in generale su qualsiasi enum? – dbasnett

+0

@ dbasnett tratta di qualsiasi enum – ElektroStudios

risposta

24

Dato uno enum

public enum Week 
{ 
    Monday, 
    Tuesday, 
    Wednesday, 
    Thursday, 
    Friday, 
    Saturday, 
    Sunday 
} 

qui ci sono le cose che si possono fare:

static void Main(string[] args) 
{ 

    // enum to int 
    int i=(int)Week.Thursday; 

    // int to enum; 
    Week day=(Week)3; 

    // enum to string 
    string name=Week.Thursday.ToString(); 
    string fun=Enum.GetName(typeof(Week), 6); 
    string agh=Enum.GetName(typeof(Week), Week.Monday); 
    string wed=EnumName(Week.Wednesday); 

    // string to enum 
    Week apt=(Week)Enum.Parse(typeof(Week), "Thursday"); 

    // all values of an enum type 
    Week[] days=(Week[])Enum.GetValues(typeof(Week)); 

    // all names of an enum type 
    string[] names=Enum.GetNames(typeof(Week)); 

} 

static string EnumName<T>(T value) 
{ 
    return Enum.GetName(typeof(T), value); 
} 
+1

Fell su questo articolo che spiega i pro ei contro per .ToString() e .GetName(): http://blog.reneorban.com/2012/01/how-to-get-string-name-of-enum-and-why.html – SvendK

7

In C#, che sarebbe:

return Enum.ToObject(typeof(T), EnumValue).ToString(); 

o (altrettanto):

return ((T)(object)(EnumValue)).ToString(); 
+0

Grazie mille, perché hai cancellato l'esempio esteso? quell'esempio mi ha salvato: P – ElektroStudios

+0

Non c'è bisogno di assegnare valore a 'object' e' T'. Basta chiamare '.ToString()' – ja72

+0

@ ja72 no, 'EnumValue' è digitato come' int' - che ti darà '" 0 "' –

4
public enum WeekDay 
{ 
    Monday = 1, 
    Tuesday = 2, 
    Wednesday = 3, 
    Thursday = 4, 
    Friday = 5, 
    Saturday = 6, 
    Sunday = 7 
} 

string s = WeekDay.Friday.ToString(); 

semplice come sembra ... a meno che non sto equivoco qualcosa?

E se avete solo il numero:

string s = ((WeekDay)4).ToString(); 

UPDATE

OK, la prossima volta si deve ricordare che si desidera qualcosa di generico .. da utilizzare per tutte le enumerazioni e non solo quella specifica esempio. Si può provare questo:

public static class EnumExtensions 
{ 
    public static T ToEnum<T>(this int value) where T : struct 
    { 
     return (T)(object)value; 
    } 

    public static string ToEnumName<T>(this int value) where T : struct 
    { 
     return ((T)(object)value).ToString(); 
    } 
} 

Usa come questo:

int someEnumValue = 4; 
string name = someEnumValue.ToEnumName<WeekDay>(); 

o:

WeekDay weekDay = someEnumValue.ToEnum<WeekDay>(); 

io ancora non credo che sia davvero necessario, però, perché è ancora necessario sapere il tipo di enum comunque ... quindi quindi:

Questo: string name = ((WeekDay)someEnumValue).ToString();

e questo string name = someEnumValue.ToEnumName<WeekDay>();

sono equivalenti ... ma .. qualunque cosa vi si addice.

+0

È facile come hai detto, ma il mio problema riguardava come analizzare un nome enum come argomento per una funzione che restituirebbe quella stringa! grazie – ElektroStudios

+0

@ElektroHacker, vedi il mio aggiornamento. Ho una comprensione migliore ora che mi rendo conto che vuoi che qualcosa funzioni con TUTTE le enumerazioni. Divertiti. – Matt

Problemi correlati