获取枚举值的名称

26
我将尝试创建一个函数,以便我们可以获得枚举值的名称。
例如:
Get_Enum_ValueName(DayOfWeek, 0)

这将返回“Sunday”。
但是我的代码不起作用,它显示类型未定义:
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
你是在特指DateTime.DayOfWeek属性还是一般地询问任何枚举类型? - dbasnett
@dbasnett 是关于任何枚举的。 - ElektroStudios
3个回答

42
给定一个枚举类型
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

如果您想根据底层数字值(转换为整数和从整数转换)将一个enum转换为另一个不同类型的enum,则请使用以下方法:

/// <summary>
/// Casts one enum type to another based on the underlying value
/// </summary>
/// <typeparam name="TEnum">The type of the enum.</typeparam>
/// <param name="otherEnum">The other enum.</param>
public static TEnum CastTo<TEnum>(this Enum otherEnum)
{
    return (TEnum)Enum.ToObject(typeof(TEnum), Convert.ToInt32(otherEnum));
}

用作
public enum WeekEnd
{
    Saturday = Week.Saturday,
    Sunday = Week.Sunday
}

static void Main(string[] args)
{
    var day = WeekEnd.Saturday.CastTo<Week>();
    // Week.Sunday
}

1
看到了这篇文章,解释了使用.ToString()和.GetName()的优缺点:http://blog.reneorban.com/2012/01/how-to-get-string-name-of-enum-and-why.html - SvendK
1
@SvendK:链接已经失效。这个问题讨论了.ToString().GetName()的优缺点。 - roland

10

在C#中,那将会是:

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

或者(同样):
return ((T)(object)(EnumValue)).ToString();

非常感谢,为什么您删除了那个扩展示例?那个例子救了我:P - ElektroStudios
1
不需要将值转换为 objectT。只需调用 .ToString() 即可。 - John Alexiou
@ja72 不是的,EnumValue 的类型为 int - 这将给你 "0" - Marc Gravell

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

更新

好的,下次您应该提到您想要一个通用的东西,适用于所有的枚举而不仅仅是那个特定的例子。您可以尝试这样做:

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

是等价的...但是,无论哪种方法都可以。


这很容易就像你说的一样,但我的问题是如何将枚举名称解析为函数的参数,该函数将返回该字符串!谢谢 - ElektroStudios
@ElektroHacker,看到我的更新了吗?我现在更好地理解你想要适用于所有枚举类型的东西。祝玩得愉快。 - Matt
提到的"ToEnumName<T>()"是扩展方法吗?我找不到它。 - Taersious
@Taersious 是的,它就是,并且它的定义已经在我的答案中 - 就在你看如何使用它的几行代码上面。 - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接