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