Как я должен инкапсулировать это многомерное перечисление? - PullRequest
1 голос
/ 03 декабря 2010

В моем приложении у меня есть некоторая информация, которая может быть одним из небольшого набора значений - поэтому я хотел бы использовать перечисление для его хранения, обеспечивая действительные значения через безопасность типов во время компиляции:

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. Созданиеstruct, которая упаковывает перечисление и предоставляет свойства для упакованных данных, например,

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 ]

4 голосов
/ 03 декабря 2010

Третий вариант: как и второй вариант, но с методами расширения:

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();

К сожалению, нет свойств расширения, но такова жизнь.

В качестве альтернативы, создайте свой собственный псевдо-enum: что-то вроде этого:

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; }
}
0 голосов
/ 03 декабря 2010

Почему бы просто не использовать два перечисления и, возможно, определить структуру, которая содержит по одному из каждого?

...