在应用程序中,经常需要处理枚举值,这些值通常用于表示状态、类型等。然而,枚举值往往不够直观,不易于用户理解。本文将介绍一种方法,通过反射和资源文件,将枚举值转换为更易于理解的字符串,从而提高应用程序的用户界面的可读性。
假设有一个表示采购订单状态的枚举,如下所示:
public enum PurchaseOrderStatus
{
Opened,
Consulting,
InProgress,
Finalizing,
Closed,
Canceled
}
如何将这些枚举值填充到ComboBox中,以便用户能够理解每个状态背后的业务逻辑呢?下面的方法提供了一种解决方案。
方法很简单:每个枚举成员都被标记为一个属性,该属性将代码与应用程序中的人类术语资源标识符关联起来。以下是枚举看起来的样子:
public enum PurchaseOrderStatus
{
Opened,
Consulting,
InProgress,
[HumanReadable("PO_Finalizing")] Finalizing,
Closed,
Canceled
}
看起来似乎没有什么变化。除了添加了一个HumanReadable属性。但是,下面描述的帮助代码假设资源文件中有字符串,如PurchaseOrderStatus.Opened、PurchaseOrderStatus.Consulting等,以及PO_Finalizing,然后使用反射将代码替换为人类可读的信息。
现在,只需调用帮助类方法,即可从资源中获取枚举值到字符串的映射:
// 在表单初始化代码中的某处...
ComboBox purchaseOrderStatus;
...
// 这些可以从IDE中设置
purchaseOrderStatus.DisplayMember = "HumanReadableName";
purchaseOrderStatus.ValueMember = "Value";
// -
purchaseOrderStatus.DataSource = EnumToHumanReadableConverter.Convert(typeof(PurchaseOrderStatus), YourResourceManager);
EnumToHumanReadableConverter.Convert方法使用反射从枚举中获取资源字符串标识符,并返回一个HumanReadableName-Value对的ArrayList。ComboBox通过其DataSource属性消费这个列表,并使用DisplayMember和ValueMember属性来了解要显示什么以及返回什么作为SelectedValue。
以下是如何设置ComboBox以显示枚举值的代码:
ResourceManager YourResourceManager = new ResourceManager("HumanizingTheEnumerations.Strings", Assembly.GetExecutingAssembly());
purchaseOrderStatus.DataSource = EnumToHumanReadableConverter.Convert(typeof(PurchaseOrderStatus), YourResourceManager);
如果不打算本地化应用程序的用户界面,可以使用Convert方法的简化版本:
purchaseOrderStatus.DataSource = EnumToHumanReadableConverter.Convert(typeof(PurchaseOrderStatus));
从版本2开始,可以为枚举的特定值获取可读字符串:
labelTest.Text = EnumToHumanReadableConverter.StringFor(InvoiceStatus.Processing, YourResourceManager);
// 或者
labelTest.Text = EnumToHumanReadableConverter.StringFor(InvoiceStatus.Processing);
开始使用描述的方法所需的所有内容都在HumanReadableAttribute.cs文件中。