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

时间:2010-08-31 21:41:05

标签: c# design-patterns enums

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

在我深入挖掘它之前,我想要考虑填写一个可能的洞。

感谢。

3 个答案:

答案 0 :(得分:14)

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

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

    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()方法。关于共享整个事情,我有点不确定,但这里是获取一个描述属性来装饰枚举常量的基本算法。解析一个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;
    

答案 1 :(得分:5)

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

答案 2 :(得分:0)

Enum like constru绝对是正确的选择。如果由于某种原因你不想使用熟悉的内置方式,你可以让你拥有一个更实用的bir。这是基本的想法:

class Country {
    private static Country US;
    private static Country JP

    static Country() { //initialize static variables }
    private Country( string name ) { //initialize variables of Country instance }

    }

这有一种设计模式,但我忘了这个名字。