2

カスタム列挙型クラスを機能させようとしています。これにより、ユーザーフレンドリーな識別子と任意の関連付けられた値を使用して列挙型を作成できるようになります。ここまでは順調ですね:

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());

次のステートメントでは、2ではなく0が返されます。問題はbeforefieldinitが原因だと思います。静的フィールドを強制的にロードする特定の列挙型のメソッドを直接呼び出すことでこれを回避できますが、これは最善の解決策ではないと思います。

ヒント:ここでは、列挙型の[UserfriendlyName()]属性を提案しないでください。私はすでにそれらを知っています。

編集 ありがとう、ハンス。私は確かに自分のコードにタイプミスがあり、間違ったジェネリックスペシャライゼーションと呼んでいました。

ここで私の質問は、各サブクラスのItemListの再定義を取り除くことができるかということですが、静的フィールドを初期化するためにこれが必要なようです。

4

2 に答える 2

2

「静的コンストラクター」を使ってみませんか?

public class Zahlungsart : EnumBase<int, Zahlungsart>
{
    public static readonly Zahlungsart Erlagsschein;
    public static readonly Zahlungsart Lastschrift;

    static Zahlungsart()
    {
        Erlagsschein = new Zahlungsart("Erlagsschein", 0);
        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; } }
}
于 2010-12-08T17:56:29.853 に答える
1

あなたのコードは問題を再現しません。ただし、次のようにプロパティを変更すると、再現が得られます。

    public new static IEnumerable<Zahlungsart> ItemList { 
        get { return EnumBase<uint, Zahlungsart>.ItemList; }   // Note: uint instead of int
    }

ジェネリック型から生成されたすべての具象クラスには独自の静的フィールドがあり、それらは共有されないことに注意してください。

于 2010-12-08T18:27:01.950 に答える