创建丰富枚举的想法

idea to create rich enum

我为自己创建了几个相同结构的 classes - "rich enums"。所以它立即表明它可以通过另一个 class 我会继承的方式以某种方式简化。

我写了一个示例 class 来向您展示这样一个枚举包含的内容:

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

我有很多不同的 "MyEnums",但是这些 class 都具有相同的结构。所以他们有:

有没有一种方法可以创建一个 class 这种结构,然后只继承它,使过程更简单,更不容易出错?

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

  1. 它们有不同数量的静态和非静态字段
  2. 字段类型不同
  3. 每个字段的值不同
  4. 字段名称不同
  5. 方法不同

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

看看我很久以前在 CodeProject 上post编辑的这段代码。

http://www.codeproject.com/Articles/13293/Descriptive-Enumerations

我不会post所有的代码,虽然还不错,但是这里有一个实际使用它的例子。在这种情况下,我试图定义一个乘客的航空公司座位偏好的枚举。

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)
    {
    }
}

因此,如您所见,相当 干净。当然,您当然可以扩展它以添加其他方法,或包含 "default" 等

然后你可以这样使用它:

class Example
{

    public static void Main(string[] args)
    {
        SeatType c = SeatType.AnythingExceptSeatNearBathroom;

        Console.WriteLine(c.Description);
        Console.WriteLine(SeatType.AnythingExceptSeatNearBathroom == c);
        foreach (SeatType seat in SeatType.GetEnumMembers())
        {
            Console.WriteLine(String.Format("Seat type code: {0} - description: {1}",seat.Code,seat.Description));
        }


        Console.ReadLine();
    }
}

基础 DescriptiveEnum class 也内置了转换运算符,因此它的工作方式与枚举一样。也就是说,你可以说:

SeatType c = (SeatType) SomeMethodThatReturnsAnInt();

看来你是在重新发明轮子:Headspring.Enumeration

因此,如果您的目标只是让这样一个 "rich" 枚举 class 可用,那么可以使用 Nuget 包;如果您的目标是自己编写...好吧,查看现有技术以获取灵感永远不会有坏处。