替换需要翻译和枚举的枚举

时间:2009-07-09 08:36:04

标签: c# enums

我们有一些可以导出为各种格式的东西。目前,我们将这些格式表示为这样的枚举:

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

问题是必须枚举这些,并且它们还需要在ui中进行翻译或描述。目前我通过创建两个扩展方法解决了这个问题他们工作,但我真的不喜欢他们或解决方案......他们觉得有点臭。问题是我真的不知道如何做得更好。有没有人有任何好的选择?这是两种方法:

    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 个答案:

答案 0 :(得分:5)

您可以使用Describe中的Formats方法来避免在多个位置执行所有位操作,如下所示:

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 :(得分:1)

我想到的另一种方法是使用System.Attribute类。

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

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

然后在Describe功能中使用Reflection with。 这种方法的唯一好处是在一个地方定义和描述。

答案 2 :(得分:0)

Dupe:How do I have an enum bound combobox with custom string formatting for enum values?

  

您可以编写一个TypeConverter来读取指定的属性,以便在资源中查找它们。因此,您可以获得显示名称的多语言支持而无需太多麻烦。

     

查看TypeConverter的ConvertFrom / ConvertTo方法,并使用反射来读取枚举字段中的属性。

<强>增加:

在链接的帖子中向下滚动,以获得TypeConverter的实现,该部署完全支持所需的部分内容。

这将支持同时具有多种语言的应用程序,而不仅仅是代码名称 - &gt;英文名字。

请记住,这只是显示名称,而不是存储的值。您应始终存储代码名称或整数值,以使用相同的数据支持具有不同区域设置的用户。