Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该如何封装这个多维枚举?_C#_Enums_Encapsulation - Fatal编程技术网

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。