You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:09:07