私はユーザーフレンドリな識別子と任意の関連値で列挙型を作成できるようにするカスタム列挙型クラスを取得しようとしています。これまでのところ良い:静的フィールドでの不思議な動作
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; } }
}
そして今、私の問題:
Console.WriteLine(Zahlungsart.ItemList.Count());
次の文は私に0を与え、問題はbeforefieldinitする予定である代わりに2の、私は思います。私は静的なフィールドを強制的にロードする特定の列挙型のメソッドを呼び出すことでこれを回避できますが、これは最善の解決策ではありません。
ヒント:ここでは、何らかの[UserfriendlyName()]属性を列挙しないでください。私は既にそれらを知っています。
EDIT ありがとう、ハンス。私は間違ったジェネリックスペシャライゼーションを呼び、自分のコードに誤字がありました。
私の質問は、各サブクラスでItemListの再定義を取り除くことができますが、静的フィールドを初期化する必要があるようです。
同じコードを実行すると、出力として「2」が得られます。 – cdhowie