这里有很多关于将字符串转换为枚举值的问题。通常,答案看起来像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");
。
答案 0 :(得分:10)
这样做是因为
因此,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>();