Überprüfen Sie, ob ein bestimmter Typ eine Aufzählung ist


117

Ich schreibe einen JsonConverter für Json.NET, mit dem ich alle Aufzählungen in einen Zeichenfolgenwert konvertieren kann, der durch ein Attribut [Description] definiert ist.

Beispielsweise:

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

Ich habe bereits den Code zur Unterstützung, myEnum.Description()der offensichtlich seine Zeichenfolgenbeschreibung zurückgibt.

In der JsonConverter-Implementierung gibt es folgende Methode:

    public override bool CanConvert(Type objectType)
    {

    }

Ich versuche herauszufinden, wie man feststellt, ob objectTypees ein ist, Enumund true zurückzugeben, damit der Konverter weiß, dass er dieses Objekt konvertieren kann. Da ich viele habe Enum, kann ich nicht jeden explizit überprüfen, also hoffte ich auf einen allgemeineren Weg, dies zu erreichen.


Wenn Sie "Bestimmen, ob objectType eine Aufzählung ist" sagen, möchten Sie grundsätzlich überprüfen, ob der objectType "MyEnum" ist und nicht nur eine andere Aufzählung. Ist das korrekt?
Pawan Mishra

Nein, ich möchte überprüfen, ob es sich um eine Aufzählung handelt. Die Antwort von @ minitech ist das, wonach ich suche.
Bryan Migliorisi

Antworten:


234

Verwenden Sie die IsEnumEigenschaft:

if(objectType.IsEnum) {
    return true;
}

62
oder einfachreturn objectType.IsEnum
Andrew Whitaker

7
@ AndrewWhitaker: Ich habe mir gedacht, dass die Methode, da sie aufgerufen CanConvertwird, nach mehreren verschiedenen möglichen Konvertierungen sucht , nicht nur, ob es sich um eine handelt enum. Andernfalls können Sie auch einfach die IsEnumImmobilie selbst nutzen.
Ry-

5
@BryanMigliorisi: Gern geschehen :) Stöbern Sie immer in IntelliSense, ich habe viel daraus gelernt.
Ry-

9
@ SergeyMetlov in PCL können Sie objectType.GetTypeInfo () verwenden. IsEnum
Alexander Müller

Wie wäre es, wenn (myObject ist Enum)
Nick Kovalsky


1

Ich habe die Frage völlig falsch interpretiert, indem ich mich zu sehr auf die [Beschreibung] konzentriert habe. Falls Sie also jemals überprüfen möchten, ob eine bestimmte Aufzählung ein [Beschreibung] -Attribut hat oder nicht (falls json eine Anpassung auslöst, wenn es keine gibt), ist dies der Fall eine Möglichkeit, dies zu überprüfen:

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;
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.