【问题标题】:how to get value of an unknown enum by name of enum and name of value?如何通过枚举名称和值名称获取未知枚举的值?
【发布时间】:2012-09-04 19:39:59
【问题描述】:

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

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

我该怎么做?

【问题讨论】:

  • 用例是什么?您要解决什么实际、真实的场景?
  • @Oded:用例:我想要一个库,您可以在其中为 ArrayList 指定自己的枚举器,以便程序员可以通过名称从 ArrayList 中获取值,其中的枚举获得 ReadableName ArrayList 的值(例如:Foo = 1、Bar = 2、Name = 3、Cost = 4 等)
  • @DanielAlexanderKarr 为什么不直接使用 Dictionary 和枚举作为键?
  • 你能给我一个使用词典的例子吗?

标签: c# enums


【解决方案1】:

您可以使用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 而不是演员表。这将处理基础类型不是Int32 的枚举值。但是,如果您的枚举具有超出Int32 范围的基础值(即:如果它是一个ulong,因为该值是>int.MaxValue),这仍然会抛出一个OverflowException

【讨论】:

  • 感谢,稍后会尝试。是否有可能获得完全限定的类型名称,例如: GetValueOf(MyEnum.Domain + "." MyEnum.Name, MyEnum.Const.ToString()) ?为了帮助您理解:我将编写一个库,其中包含一个函数,通过给定的 Enum 和 Int 的值遍历数组以获取该数组的值
  • 谢谢,这有效,现在(我不想为它打开另一个线程)我只需要最大数量的枚举,例如:“public enum Foo { a=1, b=2, c =5, } --> 响应应该是 3(因为枚举中有 3 个条目)和另一个函数来获取枚举中的最大值,例如:“public enum Foo { a=1, b=2, c=5 } - -> 响应应该是 5
  • 我还有一个至关重要的问题:我的项目获得了命名空间“Cache”,我如何获得命名空间“MyProject”的枚举“MyEnum”? “Cache.MyEnum” 很好用;)
  • @DanielAlexanderKarr 这应该是一个单独的问题 - 但您可以使用 Enum.GetNames 和 Enum.GetValues 来获取名称+值。请参阅:msdn.microsoft.com/en-us/library/system.enum.getnames.aspxmsdn.microsoft.com/en-us/library/system.enum.getvalues.aspx
【解决方案2】:

请尝试

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

【讨论】:

  • 请注意,这在大多数情况下都会起作用,但如果枚举的基础类型不是Int32,则抛出异常。
  • 虽然这是一个快速的解决方案,但 Enum.GetValues 和 Enum.GetNames 并未在 .NET Compact Framework 中实现(仅供 OP 了解)
  • @ReedCopsey 是的,很好的评论。要解决此问题,您可以改用 Convert.ToInt32。
【解决方案3】:

我想您正在尝试从字符串值(它的名称)中实例化枚举,那么我建议您使用 get it members via reflection 然后进行比较。

请注意反射adds a bit of overhead

【讨论】:

  • @AlbertoLeón 为什么会这样?
【解决方案4】:

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

您需要使用 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.
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 2018-02-21
    相关资源
    最近更新 更多