C#应用中如何传递任意键值对至工具方法并调用?
嘿,这个需求在C#里有几种很贴合的实现方式,我给你逐个拆解,帮你找到最接近你想要的调用风格的方案:
方案1:匿名类型(最接近你的目标调用语法)
这是最贴近你想要的写法的方案,C#支持直接创建匿名类型,调用时只需要加个new关键字就行。
实现代码
using System.Reflection; public void PrettyPrint(string message, object kvp) { Console.WriteLine(message); if (kvp == null) return; // 通过反射获取匿名类型的所有公共属性 foreach (var prop in kvp.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance)) { var value = prop.GetValue(kvp); Console.WriteLine($"{prop.Name}\t\t\t{value ?? "null"}"); } }
调用方式
PrettyPrint("Results:", new { quantity = 4, total = "$1.23", tax = "0.10" });
优缺点
- ✅ 调用语法简洁,几乎和你想要的
{ quantity:4, ... }一致,只多了个new - ❌ 匿名类型是内部访问级别,如果你需要在不同程序集之间传递这个对象会有问题
- ❌ 编译时就确定了属性结构,没法动态添加新的键值对
方案2:Dictionary<string, object>(更灵活的动态键值对)
如果需要动态添加键值对,或者要跨程序集传递,用Dictionary<string, object>是更稳妥的选择。
实现代码
public void PrettyPrint(string message, Dictionary<string, object> kvp) { Console.WriteLine(message); if (kvp == null) return; foreach (var pair in kvp) { Console.WriteLine($"{pair.Key}\t\t\t{pair.Value ?? "null"}"); } }
调用方式(C# 6+简化写法)
PrettyPrint("Results:", new Dictionary<string, object> { ["quantity"] = 4, ["total"] = "$1.23", ["tax"] = "0.10" });
进阶简化(C# 10+目标类型推断)
// 编译器会自动推断类型为Dictionary<string, object> PrettyPrint("Results:", new() { ["quantity"] = 4, ["total"] = "$1.23", ["tax"] = "0.10" });
优缺点
- ✅ 支持动态添加/删除键值对,灵活性拉满
- ✅ 类型明确,跨程序集使用无压力
- ❌ 调用时的语法比匿名类型繁琐一点,需要写Dictionary的初始化代码
方案3:重载方法(同时支持多种类型)
如果你想让方法同时兼容匿名类型和Dictionary,可以写两个重载版本,这样调用的时候可以根据场景选择最方便的方式:
using System.Reflection; using System.Collections.Generic; public void PrettyPrint(string message, object kvp) { // 先检查是不是Dictionary,如果是就转调用对应的重载 if (kvp is Dictionary<string, object> dict) { PrettyPrint(message, dict); return; } Console.WriteLine(message); if (kvp == null) return; foreach (var prop in kvp.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance)) { var value = prop.GetValue(kvp); Console.WriteLine($"{prop.Name}\t\t\t{value ?? "null"}"); } } public void PrettyPrint(string message, Dictionary<string, object> kvp) { Console.WriteLine(message); if (kvp == null) return; foreach (var pair in kvp) { Console.WriteLine($"{pair.Key}\t\t\t{pair.Value ?? "null"}"); } }
这样不管你传匿名类型还是Dictionary,方法都能正确处理~
内容的提问来源于stack exchange,提问作者user687554
相关产品推荐
相关产品推荐

