为什么Enum.Parse()返回对象?

时间:2012-09-07 20:23:54

标签: c# enums

这里有很多关于将字符串转换为枚举值的问题。通常,答案看起来像this question上的答案:

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

虽然这是一个非常合理的答案,并且您可以编写一种方法来简化调用,但它没有回答为什么 Enum.Parse()返回object的问题适当的枚举值。为什么我必须将其投射到StatusEnum


修改

基本上,问题是为什么像这样的函数不是Enum类的一部分?

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

此功能完美无缺,完全符合您的期望。 StatusEnum e = Enum.Parse<StatusEnum>("Active");

5 个答案:

答案 0 :(得分:10)

这样做是因为

  1. 它早于仿制药(即使它没有:)
  2. 通用约束不能是枚举(在主流.NET语言中)
  3. 因此,Object是唯一一种适用于任何类型的enum的类型。

    通过返回对象,即使需要强制转换,API也至少可以正常运行。

答案 1 :(得分:3)

然而,

TryParse支持类型参数:

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

因此,如果您将out值ret指定为FooEnum ret;,则之后您无需将其转换为FooEnum;它会立即成为合适的类型。

答案 2 :(得分:2)

对象的实际类型确实是StatusEnum。编写Enum.Parse时的编译器和代码不知道在编写方法时该运行时对象是什么。直到实际调用该方法才会知道它。

答案 3 :(得分:1)

.NET Core 2.0-3.1 和 .NET 5 都支持 Enum.Parse,如您所愿

答案 4 :(得分:0)

一个解决方案可能是使用静态扩展方法。

public static class StringExtensions
{
    public static T ParseEnum<T>(this string t) where T: struct 
    {
        return (T)Enum.Parse(typeof (T), t);
    }
}

...

var EnumValue = "StringValue".ParseEnum<MyEnum>();