2012-01-19 131 views
6

我有一个方法,试图匹配字符串枚举值的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 
} 

我应该如何编写上面?

+0

为什么不使用泛型传递类型参数? – millimoose

+0

你为什么用“iterator”和“yield-return”标记这个? –

+0

@Inddial我可以吗?我的enumType来自Type.GetReflectionOnlyType(somestringfromdatabase)。 – Jake

回答

13

您可以使用

return (Enum) Activator.CreateInstance(enumType); 

这会给你的默认值的类型 - 这是你想要的。

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

或者,你可以使用Unconstrained Melody里面已经包含这样的功能,以更高效,类型安全的形式:)

MyEnum value; 
if (Enums.TryParseDescription<MyEnum>(description, out value)) 
{ 
    // Parse successful 
} 

value将被设置为“0”值,如果分析操作ISN没有成功。

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

+0

应该使用'Enum.ToObject(enumType,0)'。 – hazzik

+0

@hazzik:*应该*是?为什么要*?你认为这样做的优势在于我建议的方法吗?我并不是说它不会奏效 - 只有一件事情可以发挥作用,如果你声称某人应该使用一种方法而不是另一种方法,那么你应该证明这一点。 –

+1

我不是母语的人,对我来说,这些情态动词之间没有太大区别,所以如果我冒犯了某人,那么很抱歉。 但是,为了说明理由,我认为这样做更好,因为Activator.CreateInstance是一种通用的解决方案,适用于_all_值类型,但是Enum.ToObject特定于枚举类型。而且它可能比催化剂更快。另外,在Enum.GetValues(t)里面使用了'Enum.ToObject' @ – hazzik

0

也许这将工作

return (Enum)enumValues[0]; 
+2

不,如果枚举没有定义一个对应于0的值,那么这将不起作用。它也会抛出一个异常,如果枚举不会不定义任何*值。 –

+1

@JonSkeet嗯......你怎么知道你头顶上的细节?这当然不是经常发生的事情? – Jake

+0

@Jon我不理解为什么它不起作用。它只是从数组中检索第一个元素。 – clearpath

1

我认为,正确的做法是

(Enum)Enum.ToObject(enumType, 0) 

因为

  • Activator.CreateInstance是针对所有值类型的通用解决方案和Enum.ToObject是针对枚举的特定解决方案,因此Enum.ToObject de明确代码的意图。
  • Enum.ToObject可能工作速度比Activator.CreateInstance
  • Enum.ToObject用于内部Enum.GetValues检索值。