Verifique se um determinado tipo é um Enum

117

Estou escrevendo um JsonConverter para Json.NET que deve me permitir converter qualquer enum em um valor de string definido por um atributo [Description].

Por exemplo:

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

Já tenho o código de suporte, myEnum.Description()que obviamente retornará sua descrição de string.

Na implementação de JsonConverter, existe este método:

    public override bool CanConvert(Type objectType)
    {

    }

Estou tentando descobrir como determinar se objectTypeé um Enume se retorna verdadeiro para que o conversor saiba que pode converter este objeto. Como tenho muitos Enum, não posso verificar explicitamente cada um, então esperava uma maneira mais genérica de fazer isso.

Bryan Migliorisi
fonte
Quando você diz "determine se objectType é um Enum", você basicamente deseja verificar se o objectType é "MyEnum", em vez de apenas qualquer outro enum. Isso está correto?
Pawan Mishra
Não, quero verificar se é algum Enum. A resposta da @minitech é o que estou procurando.
Bryan Migliorisi

Respostas:

234

Use a IsEnumpropriedade:

if(objectType.IsEnum) {
    return true;
}
Ry-
fonte
62
ou apenasreturn objectType.IsEnum
Andrew Whitaker
7
@AndrewWhitaker: Eu percebi que, como o método é chamado CanConvert, ele verificará se há várias conversões possíveis diferentes, não apenas se for um enum. Caso contrário, você pode simplesmente usar a IsEnumprópria propriedade.
Ry-
5
@BryanMigliorisi: De nada :) Certifique-se de sempre navegar no IntelliSense, aprendi muito com ele.
Ry-
9
@SergeyMetlov em PCL, você pode usar objectType.GetTypeInfo (). IsEnum
Alexander Müller
e se (meuObjeto é Enum)
Nick Kovalsky
19

Type.IsEnum é o que você está procurando

parapura rajkumar
fonte
1

Eu interpretei mal a questão ao me concentrar demais na [Descrição], então caso você queira verificar se um determinado enum tem um atributo [descrição] ou não (no caso de json gerar um ajuste quando não há nenhum), isso é uma maneira possível de verificar isso:

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
fonte