15

这里有很多关于将字符串转换为枚举值的问题。一般来说,答案看起来像这个问题的答案:

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

虽然这是一个完全合理的答案,并且您可以编写一个方法来简化调用,但它不能回答为什么Enum.Parse() 返回 anobject而不是适当的枚举值的问题。为什么我必须将其转换为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");.

4

5 回答 5

12

它这样做是因为

  1. 它早于泛型并且(即使它没有:)
  2. 泛型约束不能是枚举(在主流 .NET 语言中)

因此,Object它是唯一一种始终适用于任何类型的enum.

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

于 2012-09-07T20:25:25.527 回答
4

但是 TryParse 确实支持类型参数:

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

因此,如果您将输出值 ret 指定为FooEnum ret;,则无需在FooEnum之后将其转换为 a ;它将立即成为正确的类型。

于 2012-09-07T21:09:17.597 回答
3

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

于 2012-09-07T20:25:37.417 回答
1

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

于 2021-02-04T10:15:40.107 回答
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>();
于 2018-12-07T17:55:59.407 回答