【问题标题】:Get the name of Enum value获取枚举值的名称
【发布时间】:2013-04-08 23:24:57
【问题描述】:

我正在尝试创建一个函数,我们可以在其中获取 EnumValue 的 Namevalue

例如:

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

【问题讨论】:

  • 为什么不直接使用EnumVariable.ToString
  • 您是专门询问 DateTime.DayOfWeek 属性还是一般询问任何枚举?
  • @dbasnett 是关于任何枚举

标签: .net vb.net visual-studio enums


【解决方案1】:

给定一个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

如果您想根据基础数值从一个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
}

【讨论】:

  • 看到这篇解释 .ToString() 和 .GetName() 优缺点的文章:blog.reneorban.com/2012/01/…
  • @SvendK:链接已损坏。 This 问题是处理.ToString().GetName() 的优缺点。
【解决方案2】:

在 C# 中,这将是:

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

或(相等):

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

【讨论】:

  • 非常感谢,为什么要删除扩展示例?这个例子救了我:P
  • 无需将值转换为objectT。只需致电.ToString()
  • @ja72 不,EnumValue 被输入为int - 这会给你"0"
【解决方案3】:
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&lt;WeekDay&gt;();

是等价的......但是......任何适合你的东西。

【讨论】:

  • 这很容易,但我的问题是如何将枚举名称解析为返回该字符串的函数的参数!谢谢
  • @ElektroHacker,查看我的更新。现在我有了更好的理解,因为我意识到您希望某些东西可以与所有枚举一起使用。玩得开心。
  • 上面提到的“ToEnumName()”是扩展方法吗?我找不到它。
  • @Taersious 是的,它的定义已经在我上面的答案中了——就在你正在研究如何使用它的上面几行。
猜你喜欢
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-07
  • 2018-02-21
  • 2012-05-14
  • 1970-01-01
相关资源
最近更新 更多