Замена перечисления, которое требует перевода и перечисления - PullRequest
1 голос
/ 09 июля 2009

У нас есть некоторые вещи, которые можно экспортировать в различные форматы. В настоящее время у нас есть эти форматы, представленные перечислением, подобным этому:

[Flags]
public enum ExportFormat
{
    None = 0x0,
    Csv = 0x1,
    Tsv = 0x2,
    Excel = 0x4,
    All = Excel | Csv | Tsv
}

Проблема в том, что они должны быть перечислены, и им также нужен перевод или описание в пользовательском интерфейсе. В настоящее время я решил эту проблему, создав два метода расширения. Они работают, но я не очень люблю их или решение вообще ... они чувствуют себя немного вонючим. Проблема в том, что я не знаю, как я мог бы сделать это лучше. У кого-нибудь есть хорошие альтернативы? Это два метода:

    public static IEnumerable<ExportFormat> Formats(this ExportFormat exportFormats)
    {
        foreach (ExportFormat e in Enum.GetValues(typeof (ExportFormat)))
        {
            if (e == ExportFormat.None || e == ExportFormat.All)
                continue;

            if ((exportFormats & e) == e)
                yield return e;
        }
    }

    public static string Describe(this ExportFormat e)
    {
        var r = new List<string>();

        if ((e & ExportFormat.Csv) == ExportFormat.Csv)
            r.Add("Comma Separated Values");

        if ((e & ExportFormat.Tsv) == ExportFormat.Tsv)
            r.Add("Tab Separated Values");

        if ((e & ExportFormat.Excel) == ExportFormat.Excel)
            r.Add("Microsoft Excel 2007");

        return r.Join(", ");
    }

Может быть, это способ сделать это, но я чувствую, что должны быть лучшие способы сделать это. Как я могу рефакторинг это?

Ответы [ 3 ]

5 голосов
/ 09 июля 2009

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

private static Dictionary<ExportFormat, string> FormatDescriptions =
    new Dictionary<ExportFormat,string>()
{
    { ExportFormat.Csv, "Comma Separated Values" },
    { ExportFormat.Tsv, "Tab Separated Values" },
    { ExportFormat.Excel, "Microsoft Excel 2007" },            
};

public static string Describe(this ExportFormat e)
{
    var formats = e.Formats();
    var descriptions = formats.Select(fmt => FormatDescriptions[fmt]);

    return string.Join(", ", descriptions.ToArray());
}

Таким образом, легко включить описания строк из внешнего источника или локализации, как указано выше.

1 голос
/ 09 июля 2009

Единственный другой способ, который приходит мне в голову, - это использование класса System.Attribute.

public class FormatDescription : Attribute
{
    public string Description { get; private set; }

    public FormatDescription(string description)
    {
        Description = description;
    }
}

А затем используйте Reflection с в вашей функции Describe. Единственным преимуществом этого метода было бы иметь определение и описание в одном месте.

0 голосов
/ 09 июля 2009

Dupe: Как получить список со списком, связанный с перечислением, с пользовательским форматированием строки для значений перечисления?

Вы можете написать TypeConverter, который читает указанные атрибуты, чтобы искать их в ваших ресурсах. Таким образом, вы получите многоязычную поддержку отображаемых имен без особых проблем.

Посмотрите на методы ConvertFrom / ConvertTo TypeConverter и используйте отражение, чтобы прочитать атрибуты в ваших полях перечисления.

Дополнение:

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

Это поддержит приложение, в котором у вас есть несколько языков одновременно, а не только кодовое имя -> английское имя.

Помните, что это только отображаемое имя, а не сохраненное значение. Вы всегда должны хранить кодовое имя или целочисленное значение для поддержки пользователей с разными локалями, использующих одни и те же данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...