我该如何封装这个多维枚举?

时间:2010-12-02 21:16:35

标签: 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 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: 保持枚举原样并创建一个静态Helper类,它提供了获取值的静态函数:

public static class SomethingHelper
{
    public static string Letter(Something val)
    {
        // switch on val parameter
    }

    public static int Number(Something val)
    {
        // switch on val parameter
    }
}

我应该选择哪个,为什么?还是有一个我没想过的更好的解决方案?

2 个答案:

答案 0 :(得分:4)

第三个选项:与第二个选项类似,但使用扩展方法:

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

答案 1 :(得分:0)

为什么不使用两个枚举,也许定义一个包含每个枚举的结构?