Почему Enum.Parse() возвращает объект?
Здесь много вопросов о преобразовании строк в значение перечисления. Как правило, ответ выглядит примерно как ответы на этот вопрос:
StatusEnum MyStatus = (StatusEnum) Enum.Parse( typeof(StatusEnum), "Active", true );
Хотя это вполне разумный ответ, и вы можете написать метод для упрощения вызова, он не отвечает на вопрос почему. Enum.Parse() возвращает object
вместо соответствующее значение перечисления. Почему мне нужно отправить его на StatusEnum
?
Edit:
В принципе, возникает вопрос, почему такая функция не является частью класса Enum?
public static T Parse<T>(string value) where T: struct
{
return (T)Enum.Parse(typeof (T), value);
}
Эта функция работает отлично, делает именно то, что вы ожидаете. StatusEnum e = Enum.Parse<StatusEnum>("Active");
.
Ответы
Ответ 1
Он делает это, потому что
- Это предшествовало дженерикам и (даже если это не так:)
- Общие ограничения не могут быть перечислениями (на основных языках .NET)
Таким образом, Object
- единственный тип, который всегда будет работать для любого типа enum
.
Возвращая объект, API по меньшей мере функциональный, даже если требуется бросок.
Ответ 2
Однако TryParse поддерживает параметр типа:
Enum.TryParse<FooEnum>(name, true, out ret);
Следовательно, если вы укажете значение out ret как FooEnum ret;
, вам не нужно будет потом его перебрасывать в FooEnum
; это будет правильный тип сразу.
Ответ 3
Фактический тип объекта действительно StatusEnum
. Компилятор и код при написании Enum.Parse
понятия не имеют, какой именно объект времени выполнения будет в момент написания метода. Он не будет известен, пока метод не будет вызван.
Ответ 4
Решением может быть использование статического метода расширения.
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>();