C# 与枚举类似,但用于对象

C# 与枚举类似,但用于对象,c#,C#,我有一个自定义类“Error”和一些预先创建的错误(让我们称它们为a、B和C)。现在,我想将这些预先创建的数据分组到一个组下(例如,“StockErrors”),并像枚举一样使用它们: private void SomeFunction(Error NewError) { if (NewError == StockErrors.A) DoSomething(); // this is what I need. } 你知道我怎样才能做到这一点吗?这可能是非常简单的事情 提前谢谢 创建一个

我有一个自定义类“Error”和一些预先创建的错误(让我们称它们为a、B和C)。现在,我想将这些预先创建的数据分组到一个组下(例如,“StockErrors”),并像枚举一样使用它们:

private void SomeFunction(Error NewError)
{
    if (NewError == StockErrors.A) DoSomething(); // this is what I need.
}
你知道我怎样才能做到这一点吗?这可能是非常简单的事情


提前谢谢

创建一个名为
StockErrors
static
类,其中包含
类型为
Error
公共静态只读
字段,这些字段初始化为适当的值。(也可以使用属性)

根据您的
错误
类,您可能还需要覆盖
==
=
等于
,和
GetHashCode
来使用值语义。

类似这样的内容:

public static class StockErrors
{
    public static readonly Error A = new Error("A");
    public static readonly Error B = new Error("B");
    public static readonly Error C = new Error("B");
}
这是最简单的声明,尽管它公开了字段,这通常被认为是糟糕的形式。为了让它更易于接受,您可以将字段声明为
private
,然后在
publicstatic
属性中公开它们

此外,如果不能仅基于常量值构造
Error
类,则需要在静态构造函数中初始化变量。下面是一个示例,其中值由属性公开并在静态构造函数中初始化:

public static class StockErrors
{
    private static readonly Error a;
    private static readonly Error b;
    private static readonly Error c;

    public static Error A { get { return a; } }
    public static Error B { get { return b; } }
    public static Error C { get { return c; } }

    static StockErrors()
    {
        a = new Error(...);
        b = new Error(...);
        c = new Error(...);
    }
}

替代覆盖相等比较的方法是,将所有构造函数设为私有,并仅通过静态属性将实例公开为单例,然后依赖对象标识。@Daniel:他说了一些值。单例不是绝对正确的术语-我指的是每个特定错误一个实例。@Daniel:与其他值相反。他确实想要一个公共构造函数。顺便说一句,我把这种模式称为“Multiton”,现在我明白了——他可能需要创建其他实例。哇,你们太棒了!工作完美:)