Comprobación de si la instancia de tipo es una enumeración que acepta valores NULL en C #

83

¿Cómo verifico si un tipo es una enumeración anulable en C # algo así como

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

Respuestas:

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

EDITAR: Voy a dejar esta respuesta ya que funcionará, y demuestra algunas llamadas que los lectores quizás no conozcan. Sin embargo, la respuesta de Luke es definitivamente mejor: ve a votar :)

Tu puedes hacer:

public static bool IsNullableEnum(this Type t)
{
    return t.IsGenericType &&
           t.GetGenericTypeDefinition() == typeof(Nullable<>) &&
           t.GetGenericArguments()[0].IsEnum;
}
Jon Skeet
fuente
Creo que lo habría hecho a la manera de Luke; menos complejo para la persona que llama.
Marc Gravell
2
@Marc: No veo cómo las probabilidades de la persona que llama , pero el estilo de Luke es ciertamente mejor que el mío.
Jon Skeet
Sí, definitivamente guárdelo para referencia futura
adrin
Si. Habría hecho "public static bool IsNullableEnum (object value) {if (value == null) {return true;} Type t = value.GetType (); return / * same as Jon's return * /;}" porque puede trabajar con tipos en caja. Y luego sobrecargado con la respuesta de LukeH para un mejor rendimiento.
TamusJRoyce
15

A partir de C # 6.0, la respuesta aceptada se puede refactorizar como

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

¿Se necesita == verdadero para convertir bool? bool

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

Dejé fuera la IsEnumverificación que ya hizo, ya que eso hace que este método sea más general.

Bryan Watts
fuente