C# 创建富枚举的想法

C# 创建富枚举的想法,c#,enums,C#,Enums,我为自己创建了几个相同结构的类——“富枚举”。因此,它立即表明,它可以被我将继承的另一个类以某种方式简化 我编写了一个示例类来向您展示这样的枚举包含什么: class RichEnum { // ??? } class MyEnum : RichEnum { // FIELDS AND CONSTRUCTOR(S) public readonly string A; public readonly int B; public readonly Objec

我为自己创建了几个相同结构的类——“富枚举”。因此,它立即表明,它可以被我将继承的另一个类以某种方式简化

我编写了一个示例类来向您展示这样的枚举包含什么:

class RichEnum
{
    // ???
}

class MyEnum : RichEnum
{
    // FIELDS AND CONSTRUCTOR(S)
    public readonly string A;
    public readonly int B;
    public readonly Object C;

    public MyEnum(string A, int B, Object C)
    {
        this.A = A;
        this.B = B;
        this.C = C;
    }

    // STATIC INSTANCES
    public static readonly MyEnum Example1 = new MyEnum("string1", 1, "object1");
    public static readonly MyEnum Example2 = new MyEnum("string2", 2, "object2");
    public static readonly MyEnum Example3 = new MyEnum("string3", 3, "object3");

    // SPECIAL INSTANCE
    public static readonly MyEnum Default = new MyEnum("default", 0, "default");

    // SPECIAL OBJECT FOR ITERATING OVER STATIC INSTANCES
    public static readonly MyEnum[] Values = { Example1, Example2, Example3 };

    // METHODS
    public int GetSomeNumber()
    {
        return B + 10;
    }
}
我有很多不同的“myenum”,但是这些类都有相同的结构。因此,他们:

  • 一些不同类型的公共只读字段(变量编号)
  • 一个或多个构造函数
  • 公共静态只读实例
  • 一个特殊字段,用于在所有实例都无法匹配条件时返回值。例如,当我使用MyEnum.Values.FirstOrDefault(…)时,如果找不到任何内容,它将返回默认值
  • 一些方法

有没有一种方法可以创建这种结构的一个类,然后从中继承,从而使过程更简单,更不容易出错?

如果您仔细观察,这些类实际上没有任何可以抽象的共同点:

  • 它们有不同数量的静态和非静态字段
  • 字段的类型不同
  • 每个字段的值都不同
  • 字段的名称不同
  • 方法不同

  • 除非找到它们的共同点,否则无法创建基类。可以帮助您的是包含此类类的总体布局的代码片段,以加快您的键入速度。

    看看很久以前我在CodeProject上发布的这段代码

    我不会发布所有的代码,虽然它不是很糟糕,但这里有一个实际使用它的示例。在本例中,我试图定义乘客的航空公司座位偏好的枚举

    public class SeatType : DescriptiveEnum<SeatType, int>
    {
        public static readonly SeatType Window = new SeatType("Window Seat", 1);
        public static readonly SeatType Aisle = new SeatType("Aisle Seat", 2);
        public static readonly SeatType AnythingExceptSeatNearBathroom = new SeatType("Anything Except Seat Near Bathroom", 3);
    
        private SeatType(string desc, int code)
            : base(desc, code)
        {
        }
    }
    
    基本DescriptiveEnum类还嵌入了转换运算符,因此它的工作方式与枚举类似。也就是说,你可以说:

    SeatType c = (SeatType) SomeMethodThatReturnsAnInt();
    

    看来你正在重新发明轮子:


    因此,如果您的目标只是提供这样一个“丰富”的枚举类,那么有一个Nuget包;如果你的目标是写你自己的。。。好吧,从现有技术中寻找灵感是没有坏处的。

    您可以尝试为“各种类型”创建一个具有多个类型参数的泛型类。
    SeatType c = (SeatType) SomeMethodThatReturnsAnInt();