除了枚举之外还有什么用于c#

Aur*_*Aur 10 c# enums design-patterns

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

我以为在挖到深处之前我会要求看到填充可能的洞.

谢谢.

Kei*_*thS 14

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

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

所以,鉴于以下内容:

public enum MyItems
{
   [Description("Item One")]
   ItemOne,
   [Description("Item Two")]
   ItemTwo,
   [Description("Item Three")]
   ItemThree
}
Run Code Online (Sandbox Code Playgroud)

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

foreach(MyValues value in Enum.GetValues<MyValues>())
   myDDL.Items.Add(New ListItem(value.GetDescription(), value.ToString())
Run Code Online (Sandbox Code Playgroud)

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

var theValue = myDDL.SelectedItem.Value.ParseEnum<MyValues>()
Run Code Online (Sandbox Code Playgroud)

编辑:我被要求GetDescription()方法.关于分享整个事情,我有点不确定,但这里是获取一个描述属性来装饰枚举常量的基本算法.解析一个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;
Run Code Online (Sandbox Code Playgroud)


Mar*_*ark 5

如果您正在使用具有有限且众所周知的可能状态数的变量,那么枚举确实是您使用的正确构造.有许多可能的方法可以更方便地使用UI,并且您引用了两个优秀的方法,即类型转换器和扩展方法.