VS 2008 Intellisense for C#静态词典

时间:2009-07-08 16:55:05

标签: c# visual-studio-2008 dictionary intellisense

我在C#类中有以下内容:

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

我希望有一种方法可以让Intellisense为Fields中定义的所有键提供提示。它提供了类中方法和属性的列表,包括Fields属性,但是当我访问Fields[Fields["时,除了我需要提供字符串键。有没有办法让它告诉我一个字符串键列表,因为这是一个静态类属性,在编译后完全没有动态或更改?

5 个答案:

答案 0 :(得分:9)

如果键是静态的,那么最好不要使用枚举作为键而不是字符串吗?

使用枚举,您的编译器可以告诉您选项是什么,但您不能使用字符串。

答案 1 :(得分:4)

请改为:

public enum MyKeys
{
   Key1,
   Key2,
   Key3
}

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

这将导致intellisense选择枚举类型,以便您获得所需的效果。

答案 2 :(得分:3)

在我看来,你认为readonly意味着字典不会改变。事实并非如此 - 它只意味着字段的值(它是对字典的引用)不会改变(即使它在构造函数内部仍然可以更改,并且在执行之前可以为null)。字典本身很可变。

答案 3 :(得分:1)

最好的方法是创建public static readonly字段或属性。

如果您需要类似字典的行为,您应该像其他人建议的那样将密钥设为枚举。

请记住,所有字典类都是可变的,这意味着其他代码可以添加或删除字典中的项目。防止这种情况的唯一方法是在ReadOnlyCollection周围继承KeyedCollection并公开索引器。

答案 4 :(得分:0)

我已经使用静态属性来执行此操作。

为了获得Intellisense,我为我的一个Settings类所做的是创建一个创建静态属性的代码片段。设置了代码段,以便输入设置的名称,并在属性名称和查找名称中使用相同的名称。

像这样:

 <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];
 }

这使得添加静态属性变得非常容易,并且仍然可以获得智能感知。