J'essaie de faire fonctionner une classe enum personnalisée qui devrait me permettre de créer des énumérations avec des identifiants conviviaux et une valeur arbitraire associée. jusqu'à présent si bien:Comportement étrange avec des champs statiques
public class EnumBase<T, E>
where E : class
{
private static readonly List<E> list = new List<E>();
private string text;
private T value;
public string Text { get { return text; } }
public T Value { get { return value; } }
public EnumBase(string text, T value)
{
this.text = text;
this.value = value;
list.Add(this as E);
}
protected static IEnumerable<E> ItemList
{
get { return list; }
}
}
public class Zahlungsart : EnumBase<int, Zahlungsart>
{
public static readonly Zahlungsart Erlagsschein = new Zahlungsart("Erlagsschein", 0);
public static readonly Zahlungsart Lastschrift = new Zahlungsart("Lastschrift", 1);
private Zahlungsart(string text, int value) : base(text, value) { }
public static new IEnumerable<Zahlungsart> ItemList { get { return EnumBase<int, Zahlungsart>.ItemList; } }
}
Et maintenant mon problème:
Console.WriteLine(Zahlungsart.ItemList.Count());
La déclaration suivante me donne 0, au lieu de 2. Le problème est dû à beforefieldinit, je pense. Je pourrais contourner cela en appelant directement une méthode de l'enum spécifique qui forcerait les champs statiques à charger, mais ce n'est pas la meilleure solution, je pense.
Indice: ne proposez pas une sorte d'attribut [UserfriendlyName()] pour enum ici, je les connais déjà.
EDIT Merci, hans. J'avais en effet une faute de frappe dans mon propre code, appelant la mauvaise spécialisation générique. Maintenant, ma question est, puis-je me débarrasser de la redéfinition de ItemList dans chaque sous-classe, mais il semble que ce soit nécessaire pour obtenir les champs statiques initialisés.
Lorsque je cours exactement le même code, j'obtiens "2" comme sortie. – cdhowie