我目前在JavaScript和用C#编程的服务器之间有一个WebSocket。在JavaScript中,我可以使用关联数组轻松地传递数据:
var data = {'test': 'val',
'test2': 'val2'};
为了在服务器端表示这个数据对象,我使用了一个Dictionary<string, string>
,但这比在JavaScript中更“输入昂贵”:
Dictionary<string, string> data = new Dictionary<string,string>();
data.Add("test", "val");
data.Add("test2", "val2");
在C#中是否有某种关联数组/Dictionary
的文字表示法?
发布于 2011-02-13 04:42:33
您使用了collection initializer语法,但是您仍然需要首先创建一个new Dictionary<string, string>
对象,因为快捷语法会被转换为一堆Add()
调用(就像您的代码一样):
var data = new Dictionary<string, string>
{
{ "test", "val" },
{ "test2", "val2" }
};
在C# 6中,您现在可以选择对字典以及任何其他支持indexers的类型使用更直观的语法。上面的语句可以重写为:
var data = new Dictionary<string, string>
{
["test"] = "val",
["test2"] = "val2"
};
与集合初始化器不同,它在幕后调用索引器设置器,而不是适当的Add()
方法。
发布于 2015-02-04 02:08:09
虽然,字典初始化器的答案是完全正确的,但我想指出另一种方法(但我可能不推荐这样做)。如果你的目标是提供简洁的API用法,你可以使用匿名对象。
var data = new { test1 = "val", test2 = "val2"};
因此,"data“变量是一个”无法描述“的匿名类型,因此只能将其作为System.Object
传递。然后,您可以编写代码,将匿名对象转换为字典。这样的代码将依赖于反射,这可能会很慢。但是,您可以使用System.Reflection.Emit
或System.Linq.Expressions
来编译和缓存委托,这将使后续调用速度更快。
在我见过的许多地方,Asp.net MVC都使用了这种技术。许多Html Helper都有接受对象或字典的重载。我假设他们的API设计的目标和你所追求的是一样的;在方法调用中使用简洁的语法。
发布于 2015-09-09 05:32:43
使用DynamicObject
,创建一个更简单的字典初始化器并不困难。
假设您想要调用以下方法
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);
这可以通过创建动态对象来实现,如下所示
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;
}
}
https://stackoverflow.com/questions/4980500
复制相似问题