c# - 静态字段的奇怪行为

标签 c# .net generics static-constructor

我正在尝试让自定义枚举类工作,这应该使我能够创建具有用户友好标识符和任意关联值的枚举。到目前为止一切顺利:

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 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; } }
}

关于c# - 静态字段的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4390328/

相关文章:

c# - 如何配置 Visual Studio 默认折叠所有区域?

java - T 具有不同类型的 ArrayList<T>

Java:如何使用遵循(通用)可扩展枚举类型模式的字段创建不可变值对象

c# - 在 .NET 图表的 X 轴中仅使用自定义标签

c# - .Net Image.Save 将 tiff 从 CTTIT Fax 4 更改为 LZW

c# - Xamarin TimeZoneInfo.GetUtcOffset 抛出 NotImplementedException

c# - 发送内联 MHTML

c# - 在多个线程上运行 COM 组件控件

c# - 创建通用异步任务函数

c# - .NET 解决方案 - 许多项目与一个项目