2009-07-08 65 views
1

我有一個C#類如下:VS 2008的智能感知的C#靜態辭典

public static readonly SortedDictionary<string, string> Fields = 
    new SortedDictionary<string, string> 
     { ... } 

我希望有一種方式來獲得智能感知到在Fields定義的所有鍵提供提示。它提供了該類中的方法和屬性的列表,包括Fields屬性,但是當我訪問Fields[Fields["時,除了需要提供字符串鍵外,沒有其他說明。有沒有辦法讓它告訴我一個字符串鍵的列表,因爲這是一個靜態類屬性,在編譯之後根本不動態或更改?

+0

這是一件很奇怪的事情。如果你的鍵是靜態的,爲它們創建一組常量,並使用這些常量而不是始終寫入字符串。 – 2009-07-08 16:57:07

+0

以及IDE應該如何知道該屬性完全不動態,並且在編譯後不會更改? – 2009-07-08 16:57:59

回答

4

而是執行此操作:

public enum MyKeys 
{ 
    Key1, 
    Key2, 
    Key3 
} 

public static readonly SortedDictionary<MyKeys, string> Fields = 
    new SortedDictionary<MyKeys, string> 
     { ... } 

這將導致智能感知拿起枚舉類型,所以你會得到預期的效果。

9

如果鍵是靜態的,那麼使用枚舉作爲鍵而不是字符串會更好嗎?

通過枚舉,你的編譯器可以告訴你什麼是選項,但是你不能用字符串來做到這一點。

1

您這樣做的最好方法可能是創建public static readonly字段或屬性。

如果你需要類似字典的行爲,你應該讓鍵爲一個枚舉,如其他人所建議的。

請記住,所有字典類都是可變的,這意味着其他代碼可以添加或刪除字典中的項目。防止這種情況的唯一方法是在KeyedCollection周圍繼承ReadOnlyCollection並公開索引器。

0

我已經使用靜態屬性來做到這一點。

爲了獲得Intellisense,我爲設置類所做的工作是創建一個創建靜態屬性的代碼片段。代碼片段的設置是爲了輸入設置的名稱,並且在屬性名稱和查找名稱中使用相同的名稱。

像這樣:

<Code Language="CSharp" Kind="method decl"> 
    <![CDATA[  public static string $name$ 
    { 
     get { return GetSetting("$name$", $default$); } 
     set { SaveSetting("$name$", value); } 
    } 
    ]]> 
</Code> 

GetSetting方法會做這樣的事情:

private static string GetSetting(string name) 
{ 
     if (!_Fields.ContainsKey(name)) 
      _Fields.Add(name, default); 
     return _Fields[name]; 
} 

這使得它可以很容易地添加靜態屬性,仍然可以得到智能感知。

3

在我看來,你認爲readonly這意味着字典將永遠不會改變。情況並非如此 - 它只意味着字段的值(它是對字典的引用)不會改變(即使在構造函數中它仍然可以改變,並且在它執行之前可以爲空)。字典本身是非常可變的。