gpt4 book ai didi

c# - c#除了enum还能用什么

转载 作者:可可西里 更新时间:2023-11-01 08:59:52 24 4
gpt4 key购买 nike

所以目前有一个用于应用程序状态的枚举。但是,将它用于 ui 时感觉有些不对劲。填充下拉列表时整数和字符串之间的许多转换。我可以使用扩展方法或类型转换器并继续使用枚举,如果枚举中有多个单词,这将很有帮助。

我想在我深入挖掘之前,我会问一下是否可以填充一个可能的洞。

谢谢。

最佳答案

我的团队在我们最近的项目中遇到了这个问题。我们保留了枚举,​​因为它们是用于已知常量值的有限列表的东西,但我们做了一些事情使它们对开发人员更友好:

  1. 我们用包含每个枚举常量的“友好名称”的 [Description()] 属性修饰枚举值。
  2. 我们创建了一个 GetDescription() 扩展方法,它可以反射性地检查枚举常量的 Description 属性并返回友好名称。如果没有,该方法会尝试将空格插入到枚举常量名称的 ToString() 中。由于 CamelCased 枚举常量是 ReSharper 强制执行的样式要求,这适用于我们大约 90% 的常量,而 Description 属性处理其余部分(名称中主要是大写首字母缩略词)。
  3. 我们为字符串创建了一个 ParseEnum() 通用扩展方法,它基本上包装了 Enum.Parse()(这很糟糕;需要在方法中指定 Enum 类型,然后转换为它)。我认为首先尝试寻找描述属性可能足够聪明,否则我们只需使用仍然可读的 ToString() 表示作为下拉项的数据值。

因此,鉴于以下情况:

public enum MyItems
{
[Description("Item One")]
ItemOne,
[Description("Item Two")]
ItemTwo,
[Description("Item Three")]
ItemThree
}

我们可以用两行用户友好的选择填充 DropDownList:

foreach(MyValues value in Enum.GetValues<MyValues>())
myDDL.Items.Add(New ListItem(value.GetDescription(), value.ToString())

... 然后我们可以用非常易读的代码解析选择:

var theValue = myDDL.SelectedItem.Value.ParseEnum<MyValues>()

编辑:有人要求我提供 GetDescription() 方法。我对分享整个事情有点犹豫,但这是获取装饰枚举常量的 Description 属性的基本算法。解析 CamelCased 名称是非常简单的 RegEx 拆分大写字母,无论如何我们的实现有点天真。此代码段需要 System.ComponentModel.DescriptionAttribute(它也是枚举常量的装饰器),并且 enumType 是扩展方法的“this”参数,类型为 Enum:

var attr = enumType.GetType().GetField(enumType.ToString())
.GetCustomAttributes(typeof(DescriptionAttribute), false);
if (attr.Length > 0)
return ((DescriptionAttribute)attr[0]).Description;

关于c# - c#除了enum还能用什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3613443/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com