使枚举值更易于理解

在应用程序中,经常需要处理枚举值,这些值通常用于表示状态、类型等。然而,枚举值往往不够直观,不易于用户理解。本文将介绍一种方法,通过反射和资源文件,将枚举值转换为更易于理解的字符串,从而提高应用程序的用户界面的可读性

假设有一个表示采购订单状态的枚举,如下所示:

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文件中。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485