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

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

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

person adrin    schedule 27.04.2010    source источник


Ответы (4)


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

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

public static bool IsNullableEnum(this Type t)
{
    return t.IsGenericType &&
           t.GetGenericTypeDefinition() == typeof(Nullable<>) &&
           t.GetGenericArguments()[0].IsEnum;
}
person Jon Skeet    schedule 27.04.2010
comment
Думаю, я бы поступил так, как Люк; менее сложный для вызывающего абонента. - person Marc Gravell; 27.04.2010
comment
@Marc: я не понимаю, как это влияет на звонящего, но способ Люка определенно лучше моего. - person Jon Skeet; 27.04.2010
comment
Да, определенно сохраните это для дальнейшего использования - person adrin; 27.04.2010
comment
Да. Я бы сделал public static bool IsNullableEnum (значение объекта) { if (value == null) { return true; } Введите t = value.GetType(); return /* то же, что и у Джона */ ; } потому что он может работать с типами в штучной упаковке. А затем перегружаем ответом LukeH для лучшей производительности. - person TamusJRoyce; 03.05.2012

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

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

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

person Bigjim    schedule 12.04.2016

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

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

person Bryan Watts    schedule 27.04.2010

См. http://msdn.microsoft.com/en-us/library/ms366789.aspx

person Daniel Renshaw    schedule 27.04.2010