Подтвердить что ты не робот

Почему 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");.

4b9b3361

Ответ 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>();