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?

Respuestas:


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

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;
}

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


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.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.