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

Как проверить, является ли тип нулевым перечислением в С# что-то вроде

Type t = GetMyType();
bool isEnum = t.IsEnum; //Type member
bool isNullableEnum = t.IsNullableEnum(); How to implement this extension method?

Ответ 1

public static bool IsNullableEnum(this Type t)
{
    Type u = Nullable.GetUnderlyingType(t);
    return (u != null) && u.IsEnum;
}

Ответ 2

EDIT: я собираюсь оставить этот ответ, поскольку он будет работать, и он демонстрирует несколько вызовов, о которых читатели могут не знать. Тем не менее, Ответ Люка определенно лучше - пойдите вверх:)

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

public static bool IsNullableEnum(this Type t)
{
    return t.IsGenericType &&
           t.GetGenericTypeDefinition() == typeof(Nullable<>) &&
           t.GetGenericArguments()[0].IsEnum;
}

Ответ 3

Как и в случае с С# 6.0, принятый ответ может быть реорганизован как

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

Для преобразования bool требуется == true. to bool

Ответ 5

public static bool IsNullable(this Type type)
{
    return type.IsClass
        || (type.IsGeneric && type.GetGenericTypeDefinition == typeof(Nullable<>));
}

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