Compruebe si un tipo determinado es una enumeración

117

Estoy escribiendo un JsonConverter para Json.NET que debería permitirme convertir cualquier enumeración en un valor de cadena definido por un atributo [Descripción].

Por ejemplo:

public enum MyEnum {
    [Description("Sunday")] Sunday,
    [Description("Monday")] Monday,
    [Description("Tuesday")] Tuesday,
    [Description("Wednesday")] Wednesday,
    [Description("Thursday")] Thursday,
    [Description("Friday")] Friday,
    [Description("Saturday")] Saturday
}

Ya tengo el código de soporte myEnum.Description()que obviamente devolverá su descripción de cadena.

En la implementación de JsonConverter, existe este método:

    public override bool CanConvert(Type objectType)
    {

    }

Estoy tratando de averiguar cómo determinar si objectTypees un Enumy devolver verdadero para que el convertidor sepa que puede convertir este objeto. Como tengo muchos Enum, no puedo marcar explícitamente cada uno, así que esperaba una forma más genérica de lograr esto.

Bryan Migliorisi
fuente
Cuando dices "determinar si objectType es una enumeración", básicamente quieres verificar si objectType es "MyEnum", en lugar de cualquier otra enumeración. ¿Es eso correcto?
Pawan Mishra
No, quiero comprobar si es alguna enumeración. La respuesta de @ minitech es lo que estoy buscando.
Bryan Migliorisi

Respuestas:

234

Utilice la IsEnumpropiedad:

if(objectType.IsEnum) {
    return true;
}
Ry-
fuente
62
o simplementereturn objectType.IsEnum
Andrew Whitaker
7
@AndrewWhitaker: pensé que dado que se llama al método CanConvert, verificará múltiples conversiones posibles diferentes, no solo si es un enum. De lo contrario, también puede usar la IsEnumpropiedad en sí.
Ry-
5
@BryanMigliorisi: De nada :) Asegúrate de navegar siempre por IntelliSense, he aprendido mucho de él.
Ry-
9
@SergeyMetlov en PCL puede usar objectType.GetTypeInfo (). IsEnum
Alexander Müller
¿Qué tal si (myObject es Enum)
Nick Kovalsky
1

Malinterpreté completamente la pregunta al centrarme demasiado en la [Descripción], por lo que en caso de que alguna vez quiera verificar si una enumeración en particular tiene un atributo [descripción] o no (en caso de que json arroje un ajuste cuando no hay ninguno), esto es una posible forma de comprobarlo:

public override bool CanConvert(Type objectType)
{
    FieldInfo[] fieldInfo = objectType.GetFields(BindingFlags.Public | BindingFlags.Static);

    if( fieldInfo.Length > 0 )
    {
        return ( fieldInfo[0].GetCustomAttributes(typeof(DescriptionAttribute),false).Length > 0 );
    }
    else
    {
        return false;
    }
}
Tom
fuente