Проверка, является ли экземпляр Type обнуляемым перечислением в C #

84

Как проверить, является ли Type перечислением с нулевым значением в C #, например

Type t = GetMyType();
bool isEnum = t.IsEnum; //Type member
bool isNullableEnum = t.IsNullableEnum(); How to implement this extension method?
Адрин
источник

Ответы:

170
public static bool IsNullableEnum(this Type t)
{
    Type u = Nullable.GetUnderlyingType(t);
    return (u != null) && u.IsEnum;
}
Лука
источник
44

РЕДАКТИРОВАТЬ: я собираюсь оставить этот ответ, поскольку он будет работать, и он демонстрирует несколько вызовов, о которых читатели могут не знать иначе. Тем не менее, ответ Люка определенно лучше - проголосуйте за него :)

Ты можешь сделать:

public static bool IsNullableEnum(this Type t)
{
    return t.IsGenericType &&
           t.GetGenericTypeDefinition() == typeof(Nullable<>) &&
           t.GetGenericArguments()[0].IsEnum;
}
Джон Скит
источник
Думаю, я бы поступил так, как Люк; менее сложно для звонящего.
Марк Гравелл
2
@Marc: Я не понимаю, насколько это имеет значение для звонящего, но способ Люка определенно лучше, чем мой.
Джон Скит,
Да, определенно сохраните его на будущее,
Адрин
Да уж. Я бы сделал "public static bool IsNullableEnum (object value) {if (value == null) {return true;} Type t = value.GetType (); return / * то же, что и возврат Джона * /;}", потому что он может работать с коробочными типами. А затем перегружен ответом LukeH для лучшей производительности.
TamusJRoyce
16

Начиная с C # 6.0 принятый ответ может быть переработан как

Nullable.GetUnderlyingType(t)?.IsEnum == true

== true необходимо для преобразования bool? болтать

Bigjim
источник
1
public static bool IsNullable(this Type type)
{
    return type.IsClass
        || (type.IsGeneric && type.GetGenericTypeDefinition == typeof(Nullable<>));
}

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

Брайан Уоттс
источник