创建丰富枚举的想法
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 都具有相同的结构。所以他们有:
- 一些public只读字段(可变数)各种类型
- 一个或多个构造函数
- Public 静态只读实例
- 一个特殊字段,用于 return 如果 none 这些实例的值可以匹配条件。例如,当我使用 MyEnum.Values.FirstOrDefault(...) 时,如果没有找到
,那将 return 默认
- 一些方法
有没有一种方法可以创建一个 class 这种结构,然后只继承它,使过程更简单,更不容易出错?
如果你仔细观察,这些class实际上没有任何可以抽象的共同点:
- 它们有不同数量的静态和非静态字段
- 字段类型不同
- 每个字段的值不同
- 字段名称不同
- 方法不同
除非找到它们的共同点,否则无法创建基地 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 包;如果您的目标是自己编写...好吧,查看现有技术以获取灵感永远不会有坏处。
我为自己创建了几个相同结构的 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 都具有相同的结构。所以他们有:
- 一些public只读字段(可变数)各种类型
- 一个或多个构造函数
- Public 静态只读实例
- 一个特殊字段,用于 return 如果 none 这些实例的值可以匹配条件。例如,当我使用 MyEnum.Values.FirstOrDefault(...) 时,如果没有找到 ,那将 return 默认
- 一些方法
有没有一种方法可以创建一个 class 这种结构,然后只继承它,使过程更简单,更不容易出错?
如果你仔细观察,这些class实际上没有任何可以抽象的共同点:
- 它们有不同数量的静态和非静态字段
- 字段类型不同
- 每个字段的值不同
- 字段名称不同
- 方法不同
除非找到它们的共同点,否则无法创建基地 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 包;如果您的目标是自己编写...好吧,查看现有技术以获取灵感永远不会有坏处。