在C#中字典的字面符号?

我目前有一个JavaScript和一个用C#编程的服务器之间的WebSocket。 在JavaScript中,我可以使用关联数组轻松传递数据:

var data = {'test': 'val', 'test2': 'val2'}; 

为了在服务器端表示这个数据对象,我使用了一个Dictionary<string, string> ,但是这比在JavaScript中input更贵:

 Dictionary<string, string> data = new Dictionary<string,string>(); data.Add("test", "val"); data.Add("test2", "val2"); 

C#中的关联数组/ Dictionary是否有某种文字符号?

您使用集合初始值设定器语法,但是您仍然需要首先创build一个new Dictionary<string, string>对象,因为快捷方式语法被转换为一堆Add()调用(如您的代码):

 var data = new Dictionary<string, string> { { "test", "val" }, { "test2", "val2" } }; 

在C#6中,您现在可以select使用Dictionary更直观的语法以及任何其他支持索引器的types。 上述说法可以改写为:

 var data = new Dictionary<string, string> { ["test"] = "val", ["test2"] = "val2" }; 

与集合初始化器不同的是,这会调用索引器设置器,而不是使用适当的Add()方法。

虽然,字典初始化器的答案是完全正确的,还有另一种方法,我会指出(但我可能不会推荐它)。 如果你的目标是提供简洁的API使用,你可以使用匿名对象。

 var data = new { test1 = "val", test2 = "val2"}; 

这个“data”variables是一个“无法形容”的匿名types,所以你只能以System.Object传递它。 然后,您可以编写可以将匿名对象转换为字典的代码。 这样的代码将依靠reflection,这可能会很慢。 但是,您可以使用System.Reflection.EmitSystem.Linq.Expressions来编译和caching将使后续调用更快的委托。

Asp.net MVC API在我见过的许多地方使用这种技术。 很多Html Helpers都有接受对象或字典的重载。 我假设他们的APIdevise的目标和你所做的一样。 简洁的方法调用语法。

使用DynamicObject ,创build更简单的字典初始值设定项并不难。

想象一下你想调用下面的方法

 void PrintDict(IDictionary<string, object> dict) { foreach(var kv in dict) { Console.WriteLine (" -> " + kv.Key + " = " + kv.Value); } } 

使用类似的文字语法

 var dict = Dict (Hello: "World", IAm: "a dictionary"); PrintDict (dict); 

这可以通过创build一个像这样的dynamic对象来完成

 dynamic Dict { get { return new DynamicDictFactory (); } } private class DynamicDictFactory : DynamicObject { public override bool TryInvoke (InvokeBinder binder, object[] args, out object result) { var res = new Dictionary<string, object> (); var names = binder.CallInfo.ArgumentNames; for (var i = 0; i < args.Length; i++) { var argName = names [i]; if(string.IsNullOrEmpty(argName)) throw new ArgumentException(); res [argName] = args [i]; } result = res; return true; } }