Um Enums in Kombination mit Strings verwenden zu können, habe ich eine StringEnum-Klasse basierend auf https://stackoverflow.com/a/424414/1293385 implementiert.Casting-String zu type-safe-enum mit benutzerdefinierter Konvertierung
Allerdings habe ich Probleme, wenn ich versuche, die vorgeschlagenen benutzerdefinierten Konvertierungsoperationen zu implementieren.
Die StringEnum Klasse ist wie folgt definiert:
public abstract class StringEnum
{
private readonly String name;
private readonly int value;
protected static Dictionary<string, StringEnum> instances
= new Dictionary<string, StringEnum>();
protected StringEnum(int value, string name)
{
this.value = value;
this.name = name;
instances.Add(name.ToLower(), this);
}
public static explicit operator StringEnum(string name)
{
StringEnum se;
if (instances.TryGetValue(name.ToLower(), out se))
{
return se;
}
throw new InvalidCastException();
}
public override string ToString()
{
return name;
}
}
Ich benutze diese Klasse als Basis wie folgt aus:
public class DerivedStringEnum : StringEnum
{
public static readonly DerivedStringEnum EnumValue1
= new DerivedStringEnum (0, "EnumValue1");
public static readonly DerivedStringEnum EnumValue2
= new DerivedStringEnum (1, "EnumValue2");
private DerivedStringEnum (int value, string name) : base(value, name) { }
}
aber wenn ich versuche, es zu werfen mit
string s = "EnumValue1"
DerivedStringEnum e = (DerivedStringEnum) s;
Eine InvalidCastException wird zurückgegeben. Die Überprüfung des Codes zeigt, dass das Instanzenattribut der StringEnum-Klasse niemals gefüllt wird.
Gibt es eine einfache Möglichkeit, dies zu beheben?
Ich bevorzuge nicht C# Attribut "Magie" wie [StringValue ("EnumValue1")].
Danke!
Was Sie tun gemein durch Magie? –
Warum erfinden Sie dieses Rad neu? Das in System.ComponentModel definierte Beschreibungsattribut und eine einfache statische Klasse erfüllen die Aufgabe. –
Nicht direkt auf die Frage/Antwort (Andras Zoltan Ich denke, ist richtig), aber das statische Wörterbuch auf StringEnum wirft rote Fahnen zu mir. Wenn Sie zwei verschiedene abgeleitete Enum-Klassen haben, aber beide einen Eintrag mit demselben "Namen" haben (z. B. Colour.Orange und Fruit.Orange), führt dies nicht zu einer Argument-Exception-Ausnahme, die dem Schlüssel bereits hinzugefügt wurde, seit dem Dictionary wird statisch geteilt? Es scheint mir, dass das Wörterbuch bei jeder Implementierung neu deklariert werden sollte oder vielleicht die Typinformation zusammen mit dem Namen beim Erstellen/Nachschlagen des Schlüssels enthalten sollte. –