我在C#类中有以下内容:
public static readonly SortedDictionary<string, string> Fields =
new SortedDictionary<string, string>
{ ... }
我希望有一种方法可以让Intellisense为Fields
中定义的所有键提供提示。它提供了类中方法和属性的列表,包括Fields
属性,但是当我访问Fields[
或Fields["
时,除了我需要提供字符串键。有没有办法让它告诉我一个字符串键列表,因为这是一个静态类属性,在编译后完全没有动态或更改?
答案 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];
}
这使得添加静态属性变得非常容易,并且仍然可以获得智能感知。