如何通过枚举名称和值名称获取未知枚举的值?

20

很抱歉我要问这个问题,但我并没有找到解决此任务的正确方法:

我有一个被命名为"myEnum"的枚举(函数不知道MyEnum),我需要获得myEnum中某个值的int值:

例如:
一个程序员命名了它的枚举为"myEnum":

 public enum myEnum
 {
     foo = 1,
     bar = 2,
 }

我的函数应该实现以下功能:通过字符串获取 "myEnum" 的 "foo" 值。

函数应该按照以下方式打开:

 public int GetValueOf(string EnumName, string EnumConst)
 {

 }

所以当程序员 A 打开它时:

 int a = GetValueOf("myEnum","foo");

它应该返回1

当程序员B有一个名为"mySpace"的枚举类型时,希望使用值5返回"bar"

int a = GetValueOf("mySpace","bar")

应该返回5

我该怎么做?


2
什么是用例?你试图解决什么实际的、真实的场景问题? - Oded
1
这个的核心与这个链接中的相同:https://dev59.com/D0XRa4cB1Zd3GeqPrWjh?rq=1 - Joel Rondeau
@Oded: 使用案例:我想要一个库,在其中可以指定自己的枚举器(Enumerator)用于一个ArrayList,这样程序员可以通过名称从ArrayList中提取值,其中枚举器内部会使用ReadableName表示其ArrayList中的值(例如:Foo = 1、Bar = 2、Name = 3、Cost = 4等)。 - Daniel Alexander Karr
@DanielAlexanderKarr 为什么不直接使用一个以枚举为键的Dictionary呢? - Reed Copsey
你能给我一个使用字典的例子吗? - Daniel Alexander Karr
4个回答

31

您可以使用Enum.Parse 来实现此操作,但需要使用枚举类型的完全限定类型名称,即:"SomeNamespace.myEnum"

public static int GetValueOf(string enumName, string enumConst)
{
    Type enumType = Type.GetType(enumName);
    if (enumType == null)
    {
        throw new ArgumentException("Specified enum type could not be found", "enumName");
    }

    object value = Enum.Parse(enumType, enumConst);
    return Convert.ToInt32(value);
}

请注意,这里使用了Convert.ToInt32而不是强制转换。 这将处理枚举值的基础类型不是Int32的情况。 但是,如果您的枚举具有超出Int32范围的基础值(即:如果它是ulong且该值在>int.MaxValue之外),仍将引发OverflowException


谢谢,我会尽快尝试。有没有可能获取完全限定的类型名称,例如:GetValueOf(MyEnum.Domain + "." MyEnum.Name, MyEnum.Const.ToString())?为了帮助您理解:我将编写一个库,其中包含一个函数,通过给定的枚举和其整数值迭代数组,以获取此数组的值。 - Daniel Alexander Karr
谢谢,那个有效,现在(我不想再开一个线程)我只需要枚举条目的最大数量,例如: "public enum Foo { a=1, b=2, c=5, } --> 响应应该是3(因为枚举内有3个条目),还需要另一个函数来获取枚举内的最大值,例如: "public enum Foo { a=1, b=2, c=5 } --> 响应应该是5。 - Daniel Alexander Karr
我还有一个非常重要的问题:我的项目使用了命名空间“Cache”,如何获取命名空间“MyProject”中的枚举类型“MyEnum”?使用“Cache.MyEnum”就可以了,伙计 ;) - Daniel Alexander Karr
1
@DanielAlexanderKarr 那应该是一个单独的问题 - 但你可以使用Enum.GetNames和Enum.GetValues来获取名称+值。请参阅:http://msdn.microsoft.com/en-us/library/system.enum.getnames.aspx和http://msdn.microsoft.com/en-us/library/system.enum.getvalues.aspx - Reed Copsey

8

请尝试

int result = (int) Enum.Parse(Type.GetType(EnumName), EnumConst);

请注意,这通常可以工作,但如果枚举的基础类型不是“Int32”,则会抛出异常。 - Reed Copsey
1
尽管这是一个快速解决方案,但 Enum.GetValues 和 Enum.GetNames 在 .NET Compact Framework 中未实现(只是为了让 OP 意识到这一点)。 - Erre Efe
2
@ReedCopsey 是的,好评论。要修复它,您可以使用 Convert.ToInt32。 - petro.sidlovskyy

2
我猜你在尝试从字符串值(即其名称)实例化枚举,那么我建议你通过反射获取其成员,然后进行比较。
请注意,反射会增加一些开销

@AlbertoLeón为什么? - nawfal

2

我不确定枚举类型的名称是否必须以字符串形式指定。

您需要使用Enum.TryParse来获取枚举的值。结合泛型方法,您可以这样做:

public int? GetValueOf<T>(string EnumConst) where T : struct
{
    int? result = null;

    T temp = default(T);
    if (Enum.TryParse<T>(EnumConst, out temp))
    {
        result = Convert.ToInt32(temp);
    }

    return result;
}

要调用它,请使用以下方法:

int? result = GetValueOf<myEnum>("bar");
if (result.HasValue)
{
    //work with value here.
}

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