2011-08-04 96 views
0

我喜欢尽可能使用枚举作为价值持有者,我喜欢它。它很容易使用,即放一个点,看看价值。这是一段时间内硬代码的很好替代。其他相当于枚举?

但它仍然有一些限制。我们不能将特殊字符放在值和其他值中。

其实我试图让代码可重用。请指导我。是否有一些技术或方法可以使用某些数据结构,比如灵活但没有限制的枚举。

+3

eh .............? – saj

+0

你能举几个例子说明你想做什么“没有限制吗?” – n8wrl

+0

我并不完全遵循你的例子限制*我们不能把特殊字符放在值和其他一些内容中*另外,如果你想要一些有*没有限制的东西*这有点模糊。也许列出你想要做的一切。会有一个类有很多常量/字段的窍门? –

回答

4

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

如果您认为您不能使用枚举,因为您需要存储预定义的字符串值,请尝试使用该系统的便利技巧。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" 

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

1

不知道到底是什么,你需要(重:“特殊字符”),但你可以简单地使用一些常量并把它们放入一个静态类,如:

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; 
+0

听起来像他之后... ... – 2011-08-04 15:32:14

0

的一个问题是,如果你改变它定义了枚举或常量的源组件,但不重新编译依赖程序,你最终会在源不匹配和依赖程序集。例如:

public const int myConst = 5; 

您稍后更改为:

public const int myConst = 10; 

在源组件,其被重建,这是10.但是这5中的未重建任何依赖程序集。

为了避免这种情况,请使用只读而不是const。例如:

public readonly int myConst = 5; 

这与const不同,它更像是一个C++ #define,它使值直接放在代码中。只读将导致在运行时查找,所以如果你不重新编译你的依赖程序集,你仍然会得到正确的,更新的值。