当枚举类型未知时返回默认枚举值

时间:2012-01-19 14:02:41

标签: c# enums

我有一个方法尝试将字符串与枚举值的DescriptionAttribute匹配,然后返回枚举值。如果找不到匹配,它应该返回一个默认值,我认为我可以返回0.但是它不会发生......

private Enum GetEnumFromDescription(Type enumType, string description)
{
      var enumValues = Enum.GetValues(enumType);

      foreach (Enum e in enumValues)
      {
          if (string.Compare(description, GetDescription(e), true) == 0)
                    return e;
      }

      return 0; // not compiling
}

我应该如何编写上述代码?

4 个答案:

答案 0 :(得分:13)

您可以使用

return (Enum) Activator.CreateInstance(enumType);

这将为您提供该类型的默认值 - 这就是您想要的。

编辑:我希望您在编译时知道类型,在这种情况下,泛型是一种很好的方法。虽然看起来并非如此,但我会留下其余的答案,以防其他人使用它。

或者,您可以使用已经包含类似此功能的Unconstrained Melody以更高效,类型安全的形式:)

MyEnum value;
if (Enums.TryParseDescription<MyEnum>(description, out value))
{
    // Parse successful
}
如果解析操作不成功,

value将设置为“0”值。

目前它区分大小写,但您可以轻松创建不区分大小写的版本。 (或者让我知道,我可以这样做。)

答案 1 :(得分:1)

我认为正确的方法是

(Enum)Enum.ToObject(enumType, 0)

由于

  • Activator.CreateInstance是所有值类型的通用解决方案,Enum.ToObject是枚举的特定解决方案,因此Enum.ToObject声明了代码的明确意图。
  • Enum.ToObject 可能的工作速度超过Activator.CreateInstance
  • Enum.ToObject内使用
  • Enum.GetValues来检索值。

答案 2 :(得分:1)

default(T)将对此起作用。获取类型并使用默认值。默认情况下,第一个元素将被用作默认值

答案 3 :(得分:0)

也许这会起作用

return (Enum)enumValues[0];