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

Можно ли отбрасывать из общего типа в enum в С#?

Я пишу функцию утилиты, которая получает целое число из базы данных и возвращает типизированное перечисление в приложение.

Вот что я пытался сделать (обратите внимание, что я передаю имя считывателя данных и имя столбца вместо int в моей реальной функции):

public static T GetEnum<T>(int enumAsInt)
{
    Type enumType = typeof(T);

    Enum value = (Enum)Enum.ToObject(enumType, enumAsInt);
    if (Enum.IsDefined(enumType, value) == false)
    {
        throw new NotSupportedException("Unable to convert value from database to the type: " + enumType.ToString());
    }

    return (T)value;
}

Но это не позволит мне использовать (T)value, говоря:

Невозможно преобразовать тип 'System.Enum' в 'T'.

Также я прочитал несколько разных отзывов об использовании Enum.IsDefined. Производительность звучит очень плохо. Как еще я могу гарантировать допустимое значение?

4b9b3361

Ответ 1

Вот так:

return (T)(object)value;

Ответ 2

Измените это:

Enum value = (Enum)Enum.ToObject(enumType, enumAsInt);

:

T value = (T)Enum.ToObject(enumType, enumAsInt);

и удалите бросок:)

Ответ 3

Для информации, используя универсальное ограничение Enum доступно из С# 7.3 и выше.