我正在编写一个C#应用程序。在那个应用程序中,我需要传递任意键值对列表。我想将这些键/值传递给看起来像这样的实用程序方法:
public void PrettyPrint(string message, [type?] kvp)
{
Console.WriteLine(message);
foreach (var p in kvp)
{
Console.Write(p.Key + "\t\t\t" + p.Value);
}
}
请注意,那只是pseduocode。然后我想用这样的东西来调用这个函数:
PrettyPrint("Results:", { quantity:4, total:"$1.23", tax:"0.10" });
我使用C#看到的所有内容对于传递键值对来说似乎都很笨重。我是否有些偏见?是否有简洁的方法只是在C#
中传递一个动态的键值对列表答案 0 :(得分:5)
您可以使用C#7的value tuples和params
关键字:
public static void PrettyPrint(string message, params (object key, object value)[] kvp)
{
Console.WriteLine(message);
foreach (var p in kvp)
{
Console.Write(p.key + "\t\t\t" + p.value);
}
}
这样称呼:
PrettyPrint("Results: ", ("quantity", 4), ("total", "$1.23"), ("tax", 0.10));
或者,将对存储在变量中:
(object, object)[] pairs = {("quantity", 4), ("total", "$1.23"), ("tax", 0.10)};
PrettyPrint("Results: ", pairs);
或稍微简洁地使用类似foreach (var (key, value) in kvp)
的循环来避免方法签名中的p
和项目名称
public static void PrettyPrint(string message, params (object, object)[] kvp)
{
Console.WriteLine(message);
foreach (var (key, value) in kvp)
{
Console.Write($"{key}\t\t\t{value}");
}
}
答案 1 :(得分:1)
通过接受普通object
并反映其属性,可以实现与我所需要的最接近(通过语法):
public static void PrettyPrint(string message, object kvp) {
if (kvp == null)
return;
Console.WriteLine(message);
foreach (var p in kvp.GetType().GetProperties()) {
Console.Write(p.Name + "\t\t\t" + p.GetValue(kvp));
}
}
那是因为那时你可以在那里传递匿名对象:
PrettyPrint("Results:", new { quantity = 4, total = "$1.23", tax = "0.10" });
这与你在javascipt中所做的基本相同(你用什么语法作为你想要的例子)。
答案 2 :(得分:0)
您可以使用Dictionary
(https://msdn.microsoft.com/de-de/library/xfhwa508(v=vs.110).aspx)或List<Tuple<string,float>>
例如
PrettyPrint("Results:", new Dictionary<string, float>()
{
{ "quantity",4 },
{ "total", 1.23 }
});
答案 3 :(得分:0)
您可以使用,例如,Json.Net。这样您就可以绝对提交任何对象。
public void PrettyPrint(string message, object kvp)
{
Console.WriteLine(message);
var json = JsonConvert.SerializeObject(kvp, Formatting.Indented);
Console.WriteLine(json);
}
结果很漂亮。