C# 我应该如何封装这个多维枚举?
在我的应用程序中,我得到了一些信息,这些信息可以是一小组值中的一个,因此我想使用枚举来保存它,通过编译时的类型安全性来确保有效值:C# 我应该如何封装这个多维枚举?,c#,enums,encapsulation,C#,Enums,Encapsulation,在我的应用程序中,我得到了一些信息,这些信息可以是一小组值中的一个,因此我想使用枚举来保存它,通过编译时的类型安全性来确保有效值: public enum Something { A1, A2, A3, B1, B2, C1 }; 这些枚举表示多维数据,在上面的示例中,它们有一个字母和一个数字,因此我希望能够获得与它们相关的值,例如 Something example = Something.A1; // Now I want to be able to query the values fo
public enum Something { A1, A2, A3, B1, B2, C1 };
这些枚举表示多维数据,在上面的示例中,它们有一个字母和一个数字,因此我希望能够获得与它们相关的值,例如
Something example = Something.A1;
// Now I want to be able to query the values for example:
example.Letter; // I want to get "A"
example.Number; // "1"I want to get 1
我有两种可能的解决方案,它们都感觉不很“干净”,所以我对人们更喜欢哪一种,为什么,或者是否有人有更好的想法感兴趣
备选案文1:
创建一个包装枚举的结构,并提供包装数据的属性,例如
public struct SomethingWrapper
{
public Something Value { get; private set; }
public SomethingWrapper(Something val)
{
Value = val;
}
public string Letter
{
get
{
// switch on Value...
}
}
public int Number
{
get
{
// switch on Value...
}
}
}
备选案文2:
保持枚举不变,并创建一个静态帮助器类,该类提供获取值的静态函数:
public static class SomethingHelper
{
public static string Letter(Something val)
{
// switch on val parameter
}
public static int Number(Something val)
{
// switch on val parameter
}
}
我应该选择哪一个,为什么?或者有没有我没有想到的更好的解决方案?为什么不使用两个枚举,或者定义一个包含其中一个枚举的结构?为什么不使用两个枚举,或者定义一个包含其中一个枚举的结构?第三个选项:与第二个选项类似,但具有扩展方法:
public static class SomethingHelper
{
public static string Letter(this Something val)
{
// switch on val parameter
}
public static int Number(this Something val)
{
// switch on val parameter
}
}
然后你可以做:
Something x = ...;
string letter = x.Letter();
不幸的是,没有扩展属性,但这就是生命
或者,创建您自己的伪枚举:如下所示:
public sealed class Something
{
public static Something A1 = new Something("A", 1);
public static Something A2 = ...;
private Something(string letter, int number)
{
Letter = letter;
Number = number;
}
public string Letter { get; private set; }
public int Number { get; private set; }
}
第三个选项:与第二个选项类似,但具有扩展方法:
public static class SomethingHelper
{
public static string Letter(this Something val)
{
// switch on val parameter
}
public static int Number(this Something val)
{
// switch on val parameter
}
}
然后你可以做:
Something x = ...;
string letter = x.Letter();
不幸的是,没有扩展属性,但这就是生命
或者,创建您自己的伪枚举:如下所示:
public sealed class Something
{
public static Something A1 = new Something("A", 1);
public static Something A2 = ...;
private Something(string letter, int number)
{
Letter = letter;
Number = number;
}
public string Letter { get; private set; }
public int Number { get; private set; }
}
我喜欢你的第一个选项,但你的第二个选项将允许你创建像C3这样的,除非添加了很多检查代码。我的最后一个选项-我错过了静态定义。我喜欢你的第一个选项,但你的第二个选项将允许你创建像C3这样的,除非添加了大量的检查代码。上次-我错过了静态定义。在我的示例中,如果使用a,B,C作为一个枚举,1,2,3作为枚举。在我的示例中,如果使用a、B、C作为一个枚举,使用1,2,3作为枚举,则结构需要大量检查代码来确保没有创建无效值B3、C2、C3。