2013-04-16 6 views
13

Я пытаюсь сделать функцию, где мы можем получить имя-значение из EnumValueПолучить имя значения Enum

Например:

Get_Enum_ValueName(DayOfWeek, 0) 

... Это будет возвращать "воскресенье ».

Но мой код делать не работает, он говорит, что тип не определен:

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

Почему бы просто не использовать 'EnumVariable.ToString'? – ppetrov

+0

Вы спрашиваете конкретно о свойстве DateTime.DayOfWeek или вообще о любом перечислении? – dbasnett

+0

@ dbasnett о любом перечислении – ElektroStudios

ответ

24

С учетом enum

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

вот вещи, которые вы можете сделать:

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

Пошел на эту статью, объясняя плюсы и минусы для .ToString() и .GetName(): http://blog.reneorban.com/2012/01/how-to-get-string-name-of-enum-and-why.html – SvendK

7

В C#, который был бы:

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

или (поровну):

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

Большое спасибо, почему вы удалили расширенный пример? этот пример сохранил меня: P – ElektroStudios

+0

Не нужно указывать значение 'object' и' T'. Просто вызовите '.ToString()' – ja72

+0

@ ja72 no, 'EnumValue' напечатан как' int' - это даст вам '" 0 "' –

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

string s = WeekDay.Friday.ToString(); 

просто, как это ... если я не то недоразумение?

И если у вас есть только номер:

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

UPDATE

ОК, в следующий раз, когда вы должны сказать, что вы хотите что-то родовое .. использовать для всех перечислений, а не только что конкретные пример. Вы можете попробовать это:

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

Использование так:

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

или:

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

Я до сих пор не думаю, что это действительно необходимо, хотя, потому что вы все еще должны знать тип перемычки в любом случае ... поэтому поэтому:

Это: string name = ((WeekDay)someEnumValue).ToString();

и это string name = someEnumValue.ToEnumName<WeekDay>();

эквивалентны ... но .. все, что вам подходит.

+0

Это легко, как вы сказали, но моя проблема заключалась в том, как анализировать имя перечисления в качестве аргумента функции, которая возвращает эту строку! спасибо – ElektroStudios

+0

@ElektroHacker, см. мое обновление. Теперь я понимаю, что понимаю, что вы хотите что-то работать со всеми перечислениями. Повеселись. – Matt

Смежные вопросы