Проверьте, является ли данный тип перечисляемым

#c# #enums

#c# #перечисления

Вопрос:

Я пишу JsonConverter для Json.NET, который должен позволить мне преобразовать любое перечисление в строковое значение, определяемое атрибутом [Description].

Например:

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

У меня уже есть код для поддержки myEnum.Description() , который, очевидно, вернет его строковое описание.

В реализации JsonConverter существует этот метод:

     public override bool CanConvert(Type objectType)
    {

    }
  

Я пытаюсь выяснить, как определить, является ли objectType это Enum , и вернуть true, чтобы конвертер знал, что он может преобразовать этот объект. Поскольку у меня их много Enum , я не могу явно проверить каждый из них, поэтому я надеялся на более общий способ достижения этой цели.

Комментарии:

1. Когда вы говорите «определите, является ли ObjectType перечисляемым», вы в основном хотите проверить, является ли ObjectType «MyEnum», а не просто любым другим перечислением. Это правильно?

2. Нет, я хочу проверить, является ли это любым перечислением. ответ @minitech — это то, что я ищу.

Ответ №1:

Используйте IsEnum свойство:

 if(objectType.IsEnum) {
    return true;
}
  

Комментарии:

1. или просто return objectType.IsEnum

2. @AndrewWhitaker: Я понял, что, поскольку метод вызывается CanConvert , он будет проверять наличие нескольких различных возможных преобразований, а не только то, является ли это enum . В противном случае вы можете просто использовать IsEnum само свойство.

3. @BryanMigliorisi: Всегда пожалуйста 🙂 Обязательно всегда просматривайте IntelliSense, я многому из него научился.

4. @SergeyMetlov в PCL вы можете использовать ObjectType. GetTypeInfo(). IsEnum

5. как насчет того, если (MyObject является перечисляемым)

Ответ №2:

Тип.IsEnum — это то, что вы ищете

Ответ №3:

Я совершенно неверно истолковал вопрос, слишком сосредоточившись на [Description] , поэтому, если вы когда-нибудь захотите проверить, имеет ли конкретное перечисление атрибут [description] или нет (в случае, если json выдает ошибку, когда его нет), это один из возможных способов проверить это:

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