我们有一些可以导出为各种格式的东西。目前,我们将这些格式表示为这样的枚举:
[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(", ");
}
也许这是做到这一点的方法,但我觉得必须有更好的方法来做到这一点。我怎么能重构这个?
答案 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;英文名字。
请记住,这只是显示名称,而不是存储的值。您应始终存储代码名称或整数值,以使用相同的数据支持具有不同区域设置的用户。