Ich brauche eine Hilfsmethode ein Char Enum und ein Zeichen zu einem Objekt boxed vergleichen

StackOverflow https://stackoverflow.com/questions/105609

  •  01-07-2019
  •  | 
  •  

Frage

Ich habe eine Enumeration, die wie folgt aussieht:

public enum TransactionStatus { Open = 'O', Closed = 'C'};

und ich ziehe Daten aus der Datenbank mit einem einzelnen Zeichen, das angibt - Sie ahnen es -. Ob ‚O‘ die Transaktion offen oder ‚C‘ die Transaktion geschlossen wird,

Jetzt, da die Daten aus der Datenbank als Objekt kommt ich ein Heck einer Zeit mit dem Schreiben Vergleichscode habe.

Das Beste, was ich tun kann, ist schreiben:

protected bool CharEnumEqualsCharObj(TransactionStatus enum_status, object obj_status) {
    return ((char)enum_status).ToString() == obj_status.ToString();
}

Dies ist jedoch nicht der einzige Charakter Enum, die ich zu tun haben, ich habe 5 oder 6 und für sie die gleiche Methode writting ist ärgerlich, gelinde gesagt. Angeblich soll alle Aufzählungen erben von System.Enum aber wenn ich das als Eingangstyp einzustellen versuchen, erhalte ich Kompilierungsfehlern. Dies ist auch in .NET 1.1 so Generika ist indiskutabel.

Ich habe für eine Weile kämpfen mit diesem. Hat jemand einen besseren Weg, diese Methode zu schreiben? Auch kann jemand klärt die ganzen Aufzählungen von System.Enum erben, sind aber nicht polymorph Ding?

War es hilfreich?

Lösung

static void Main(string[] args)
{
    object val = 'O';
    Console.WriteLine(EnumEqual(TransactionStatus.Open, val));

    val = 'R';
    Console.WriteLine(EnumEqual(DirectionStatus.Left, val));

    Console.ReadLine();
}

public static bool EnumEqual(Enum e, object boxedValue)
{                        
    return e.Equals(Enum.ToObject(e.GetType(), (char)boxedValue));
}

public enum TransactionStatus { Open = 'O', Closed = 'C' };
public enum DirectionStatus { Left = 'L', Right = 'R' };

Andere Tipps

Aufzählungen sind in der Regel chaotisch in C # so, wenn .NET 2.0 seine gemeinsamen wickelt die Syntax mit Verwendung von Generika zu vermeiden, so plump Code zu schreiben.

In .NET 1.1 können wie die unten etwas tun, obwohl es nicht viel aufgeräumter als das Original-Snippet:

protected bool CharEnumEqualsCharObj(TransactionStatus enum_status, object obj_status)
{
    return (enum_status == Enum.Parse(typeof(TransactionStatus), obj_status.ToString()));
}

Das ist etwa die gleiche Menge an Code, aber Sie sind jetzt Enum tun, anstatt String-Vergleich.

Sie auch den Debugger / Dokumentation verwenden könnten, um zu sehen, ob obj_status wirklich ein Objekt ist oder ob Sie es sicher in eine Zeichenfolge können.

Ich würde einen Blick auf Enum.Parse nehmen. Es können Sie Ihre Zeichen in die richtige Enumeration analysieren zurück. Ich glaube, es den ganzen Weg zurück zu C # 1.0 funktioniert. Ihr Code aussehen würde, ein bisschen wie folgt aus:

TransactionStatus status = (TransactionStatus)Enum.Parse(typeof(TransactionStatus), obj.ToString());

Wenn Sie nur Werte vergleichen müssen Sie so etwas wie verwenden können:

protected bool CharEnumEqualsCharObj(TransactionStatus enum_status, object obj_status) {
    return (char)enum_status == (char)obj_status;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top