19

很抱歉问这个问题,但我没有找到适合这个任务的解决方案:

我有一个名为“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

我怎样才能做到这一点?

4

4 回答 4

30

您可以使用Enum.Parse来执行此操作,但您需要 Enum 类型的完全限定类型名称,即"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而不是演员表。这将处理具有非基础类型的枚举值Int32OverflowException但是,如果您的枚举具有超出 an 范围的基础值Int32(即:如果它是 ulong,因为值为 > int.MaxValue) ,这仍然会抛出 an 。

于 2012-09-04T19:50:02.407 回答
7

请试试

int result = (int) Enum.Parse(Type.GetType(EnumName), EnumConst);
于 2012-09-04T19:43:59.850 回答
2

我想您正在尝试从字符串值(它的名称)中实例化枚举,然后我建议您通过反射获取它的成员,然后进行比较。

请注意反射会增加一些开销

于 2012-09-04T19:44:07.560 回答
2

我不清楚枚举类型的名称是否必须指定为字符串。

您需要使用 Enum.TryParse 来获取 Enum 的值。结合通用方法,您可以执行以下操作:

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.
}
于 2012-09-04T19:56:55.517 回答