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.


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

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


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;
    }
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.