我试图让自定义枚举类工作,这应该使我能够创建具有用户友好标识符和任意关联值的枚举。到目前为止,一切都很好:
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的重新定义,但是看来这对于初始化静态字段是必需的。
最佳答案
您的代码无法解决问题。但是,如果您像这样更改属性,您将获得复制权:
public new static IEnumerable<Zahlungsart> ItemList {
get { return EnumBase<uint, Zahlungsart>.ItemList; } // Note: uint instead of int
}
请注意,从泛型类型生成的每个具体类都将具有其自己的静态字段,它们不会共享。