其他相当于枚举?

时间:2011-08-04 15:24:10

标签: c# .net c#-3.0

我喜欢尽可能使用enum作为价值持有者,我喜欢它。它易于使用,即只需放一个点并查看值。一段时间它是硬代码的良好替代品。

但它仍然有一些局限性。我们不能在值和其他值中添加特殊字符。

实际上我正在尝试使代码可重用。请指导我。是否有一些技巧或方法可以使用一些灵活但没有限制的枚举数据结构。

4 个答案:

答案 0 :(得分:6)

你可以使用常数;它们是不可变的,可以有任何价值。 另见:http://msdn.microsoft.com/en-us/library/ms173119.aspx

答案 1 :(得分:4)

如果我不能将枚举用于一组预定义值,我使用一类静态常量。它们在使用中看起来大致相同,但值可以是从小数到字符串到结构或类的任何值。我已经为GridViews中的预定义单元格颜色方案做了这个,就像内置的Color类具有预定义的常量值一样。数学和科学常数,如e和Pi(如果你想要不同于Math类提供的值),或重力加速度(9.8m / s 2 ),或光速( 299,792,458m / s),也可以这种方式指定。

如果您认为无法使用Enums,因为您需要存储预定义的字符串值,请使用System.ComponentModel Description属性尝试这个方便的技巧:

public Enum MyStrings
{
   [Description("This is string one")] StringOne,
   [Description("This is a different string")] StringTwo,
   ...
}

要获取字符串,只需检查Description属性,其代码有点乱,但可以很容易地隐藏在扩展方法后面:

public static string GetDescription(this Enum enumValue)
    {
        object[] attr = enumValue.GetType().GetField(enumValue.ToString())
            .GetCustomAttributes(typeof (DescriptionAttribute), false);

        return (attr.Length > 0) 
            ? ((DescriptionAttribute) attr[0]).Description 
            : String.Empty;            
    }

用法:

var stringOne = MyStrings.StringOne.GetDescription(); //"This is string one"

在这种情况下,您还可以考虑使用资源文件。可以从程序范围之外更改字符串的值,而无需重新编译。

答案 2 :(得分:1)

不确定你究竟需要什么(re:“特殊字符”),但你可以简单地使用一些常量并将它们放入静态类中,例如:

public static class MyConstants
{
    /// <summary>documentation here</summary>
    public const string ValueA = "somevalue";
    /// <summary>documentation here</summary>
    public const string ValueB = "something else with special characters &@";

    // etc.
}

用法:

var x = MyConstants.ValueB;

答案 3 :(得分:0)

您可能会发现枚举的一个问题,尤其是常量,如果您更改定义枚举或常量的源程序集,但不重新编译依赖程序集,则最终会导致源程序集和依赖程序集不匹配。例如:

public const int myConst = 5;

您稍后将其更改为:

public const int myConst = 10;

在重建的源程序集中,它是10.但是在未重建的任何依赖程序集中它都是5。

要避免这种情况,请使用 readonly 而不是 const 。例如:

public readonly int myConst = 5;

这与const不同,const更像是C ++ #define,它使值直接放在代码中。 Readonly将在运行时导致查找,因此如果您不重新编译依赖程序集,您仍将获得正确的更新值。