2011-08-04 67 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,它使值直接放在代碼中。只讀將導致在運行時查找,所以如果你不重新編譯你的依賴程序集,你仍然會得到正確的,更新的值。