Странное поведение со статическими полями - PullRequest
2 голосов
/ 08 декабря 2010

Я пытаюсь заставить работать пользовательский класс перечисления, который должен позволить мне создавать перечисления с удобными для пользователя идентификаторами и произвольным связанным значением.пока все хорошо:

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, а не 2. Проблема, я думаю, связана с beforefieldinit.Я мог бы обойти это, вызвав какой-то метод конкретного перечисления напрямую, который заставил бы загрузить статические поля, но я думаю, что это не лучшее решение.

Подсказка: пожалуйста, не предлагайте какой-то [UserfriendlyName ()] - атрибут для перечисления здесь, я их уже знаю.

РЕДАКТИРОВАТЬ Спасибо, Ганс.У меня действительно была опечатка в моем собственном коде, вызывающая неправильную родовую специализацию.

Теперь мой вопрос, могу ли я избавиться от переопределения ItemList в каждом подклассе, но, похоже, это необходимо для получениястатические поля инициализированы.

Ответы [ 2 ]

2 голосов
/ 08 декабря 2010

Как насчет использования "статического конструктора" ??

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; } }
}
1 голос
/ 08 декабря 2010

Ваш код не воспроизводит проблему. Но вы получите копию, если вы измените свойство следующим образом:

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

Помните, что каждый конкретный класс, сгенерированный из универсального типа, будет иметь свои собственные статические поля, они не общие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...