Sprawdź, czy dany typ jest wyliczeniem

117

Piszę JsonConverter dla Json.NET, który powinien pozwolić mi konwertować wszystkie wyliczenia na wartość ciągu zdefiniowaną przez atrybut [Opis].

Na przykład:

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

Mam już kod do obsługi, myEnum.Description()który oczywiście zwróci opis ciągu.

W implementacji JsonConverter istnieje taka metoda:

    public override bool CanConvert(Type objectType)
    {

    }

Próbuję dowiedzieć się, jak ustalić, czy objectTypejest to Enumi zwrócić true, aby konwerter wiedział, że może przekonwertować ten obiekt. Ponieważ mam wiele Enum, nie mogę dokładnie sprawdzić każdego z nich, więc liczyłem na bardziej ogólny sposób osiągnięcia tego.

Bryan Migliorisi
źródło
Kiedy mówisz „określ, czy objectType jest wyliczeniem”, zasadniczo chcesz sprawdzić, czy typ obiektu to „MyEnum”, a nie jakikolwiek inny wyliczenie. Czy to jest poprawne?
Pawan Mishra
Nie, chcę sprawdzić, czy to jakikolwiek Enum. Odpowiedź @ minitech jest tym, czego szukam.
Bryan Migliorisi

Odpowiedzi:

234

Skorzystaj z IsEnumnieruchomości:

if(objectType.IsEnum) {
    return true;
}
Ry-
źródło
62
lub po prostureturn objectType.IsEnum
Andrew Whitaker
7
@AndrewWhitaker: Pomyślałem, że skoro wywoływana jest metoda CanConvert, będzie ona sprawdzać wiele różnych możliwych konwersji, a nie tylko plik enum. W przeciwnym razie możesz po prostu użyć IsEnumsamej właściwości.
Ry-
5
@BryanMigliorisi: Nie ma za co :) Pamiętaj, żeby zawsze przeglądać IntelliSense, wiele się z niego nauczyłem.
Ry-
9
@SergeyMetlov w PCL możesz użyć objectType.GetTypeInfo (). IsEnum
Alexander Müller
jak bout if (myObject is Enum)
Nick Kovalsky
19

Type.IsEnum jest tym, czego szukasz

parapura rajkumar
źródło
1

Zupełnie źle zinterpretowałem to pytanie, skupiając się zbytnio na [Opisie], więc jeśli kiedykolwiek zechcesz sprawdzić, czy określone wyliczenie ma atrybut [description], czy nie (w przypadku, gdy json dopasowuje, gdy go nie ma), jest to jeden z możliwych sposobów sprawdzenia tego:

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;
    }
}
Tomek
źródło