С# int для преобразования перечисления

Возможный дубликат:
Вставить int для перечисления в С#

Если у меня есть следующий код:

enum foo : int
{
    option1 = 1,
    option2,
    ...
}

private foo convertIntToFoo(int value)
{
    // Convert int to respective Foo value or throw exception
}

Как выглядит код преобразования?

Ответ 1

Это просто для того, чтобы направить ваш int в Foo:

int i = 1;
Foo f = (Foo)i;

Если вы попытаетесь указать значение, которое не определено, оно все равно будет работать. Единственный вред, который может исходить от этого, заключается в том, как вы используете значение позже.

Если вы действительно хотите убедиться, что ваше значение определено в перечислении, вы можете использовать Enum.IsDefined:

int i = 1;
if (Enum.IsDefined(typeof(Foo), i))
{
    Foo f = (Foo)i;
}
else
{
   // Throw exception, etc.
}

Однако использование IsDefined стоит больше, чем просто литье. То, что вы используете, зависит от вашей реализации. Вы можете рассмотреть возможность ограничения ввода пользователем или обработку случая по умолчанию при использовании перечисления.

Также обратите внимание, что вам не нужно указывать, что ваш enum наследует от int; это поведение по умолчанию.

Ответ 2

Я уверен, что вы можете сделать явное кастинг здесь.

foo f = (foo)value;

Пока вы говорите, что перечисление наследует (?) от int, которое у вас есть.

enum foo : int

РЕДАКТИРОВАТЬ. Да, оказывается, что по умолчанию тип enums, лежащий в основе, - int. Однако вы можете использовать любой интегральный тип, кроме char.

Вы также можете использовать из значения, которое не указано в перечислении, создавая недопустимое перечисление. Я подозреваю, что это работает, просто изменив тип ссылки и фактически не изменив значение в памяти.

enum (ссылка С#)
Типы перечислений (Руководство по программированию на С#)

Ответ 3

Кастинга должно быть достаточно. Если вы используете С# 3.0, вы можете сделать удобный метод расширения для анализа значений перечисления:

public static TEnum ToEnum<TInput, TEnum>(this TInput value)
{
    Type type = typeof(TEnum);

    if (value == default(TInput))
    {
        throw new ArgumentException("Value is null or empty.", "value");
    }

    if (!type.IsEnum)
    {
        throw new ArgumentException("Enum expected.", "TEnum");
    }

    return (TEnum)Enum.Parse(type, value.ToString(), true);
}

Ответ 4

Вам не нужно наследование. Вы можете сделать:

(Foo)1 

он будет работать;)

Ответ 5

if (Enum.IsDefined(typeof(foo), value))
{
   return (Foo)Enum.Parse(typeof(foo), value);
}

Надеюсь, что это поможет

Edit Этот ответ получил голос, поскольку значение в моем примере - это строка, где, когда вопрос задан для int. Мои суждения; следующее должно быть немного яснее: -)

Type fooType = typeof(foo);

if (Enum.IsDefined(fooType , value.ToString()))
{
   return (Foo)Enum.Parse(fooType , value.ToString());
}