在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.Emit
或System.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; } }