2012-09-07 100 views
10

这里有很多关于将字符串转换为枚举值的问题。一般来说,答案看起来this question类似的答案:Enum.Parse()为什么返回对象?

StatusEnum MyStatus = (StatusEnum) Enum.Parse(typeof(StatusEnum), "Active", true); 

虽然这是一个完全合理的答案,你可以写简化呼叫的方法,它并没有回答为什么枚举的问题。 Parse()返回一个object而不是适当的枚举值。为什么我必须将它投射到StatusEnum


编辑:

基本上,问题是,为什么像枚举类这不是一部分的功能?

public static T Parse<T>(string value) where T: struct 
    { 
     return (T)Enum.Parse(typeof (T), value); 
    } 

此功能工作得很好,完全符合您的期望。 StatusEnum e = Enum.Parse<StatusEnum>("Active");

+1

@ SpYk3HH - 枚举不*有*值。他们*是*值。它们是碰巧对'.ToString()'有通常重载的值,但它们仍然只是值。 – Bobson

+2

.NET 4.0+已['Enum.TryParse '](http://msdn.microsoft.com/en-us/library/dd783499(V = VS.100)) –

+0

@ SpYk3HH枚举类型的值是一些可能与某个枚举类型的字段关联的整数。整数的大小可能会有所不同。解析需要一些字符串并返回枚举类型的盒装实例。这可以拆箱或不拆箱。你的最后一句话也没有意义。字符串和布尔值也有工作的属性和方法。 – phoog

回答

10

它这样做是因为

  1. 它早泛型和(即使它没有:)
  2. 泛型约束不能枚举(在主流的.NET语言)

因此,Object仅仅是永远对任何类型的enum工作类型。

通过返回对象,API是至少功能性的,即使需要的铸造。

+1

尽管你不能说'where t:Enum',你可以说'where t:struct'并且至少消除了引用类型,或者没有约束并且避免了cast/typeof。 – Guvante

+0

它早于仿制药的事实并不是一种探索。将上面编辑的函数添加为旧式'Enum.Parse()'的重载是一个不会改变的改变。 – Bobson

+0

@Reed - 通过你的逻辑来思考它,Enum.TryParse ()也不应该存在,但它确实存在。 – Bobson

1

实际类型的对象确实是StatusEnum。编写代码时,编译器Enum.Parse不知道该方法写入时该运行时对象的内容。直到实际调用该方法后才能知道它。然而

3

的TryParse不支持类型参数:

Enum.TryParse<FooEnum>(name, true, out ret);

因此,如果您指定的超时值RET为FooEnum ret;,你不会需要将其转换为FooEnum之后;它会马上成为正确的类型。

+0

这是真的,但你现在需要两行代码。可能三个。一个宣布'ret',这个和一个使用它,否则你可能不需要它。因此提出了为什么有一个通用形式的'TryParse()'而不是'Parse()'的通用形式的问题。 – Bobson

+0

它可能只是被忽略了。尽管你可以很容易地将自己的泛型重载作为扩展方法。 – aevitas

+0

其实你不行。你不能扩展'Enum',因为它是一个静态类。所以你会调用'EnumExtensions.Parse()'(或者你称之为你的类),并且作为扩展方法没有任何好处。 – Bobson

相关问题