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

如何将C#中的Action<Car>转换为Action<List<Car>>?

解决方案:将Action转换为Action<List>

你需要做的就是创建一个包装委托,把针对单个Car的逻辑延迟到Method2调用委托时,再遍历列表逐个执行。这样既不会提前触发Car的处理逻辑,又能满足Method2的参数要求。

直接上代码示例,一看就懂:

// 你的Method2定义
public void Method2(Action<List<Car>> listAction)
{
    // 假设这里是Method2内部创建或获取的Car列表
    var targetCars = new List<Car> { new Car(), new Car() };
    // 调用传入的委托——这时候才会触发后续的Car处理逻辑
    listAction(targetCars);
}

// 你的Method1定义,接收Action<Car>参数
public void Method1(Action<Car> carAction)
{
    // 把Action<Car>包装成Action<List<Car>>
    var wrappedListAction = new Action<List<Car>>(cars => 
    {
        foreach (var car in cars)
        {
            carAction(car);
        }
    });

    // 调用Method2,传入包装后的委托
    Method2(wrappedListAction);
}

为什么这个方案可行?

  • 这个wrappedListAction是延迟执行的:只有当Method2内部调用listAction(targetCars)时,才会遍历列表并触发每个Car的carAction,完全符合你“不提前执行仅针对Car的委托逻辑”的要求。
  • 它本质上是把“遍历列表+逐个调用单Car逻辑”的逻辑打包成了Method2需要的Action<List<Car>>类型,没有额外的提前执行开销。

进阶:封装成扩展方法(更整洁复用)

如果你的代码里需要多次做这种转换,可以写一个通用的扩展方法,让代码更简洁:

public static class ActionExtensions
{
    public static Action<List<T>> ToListAction<T>(this Action<T> singleItemAction)
    {
        return items => 
        {
            foreach (var item in items)
            {
                singleItemAction(item);
            }
        };
    }
}

然后Method1里就可以简化成一行:

public void Method1(Action<Car> carAction)
{
    Method2(carAction.ToListAction());
}

这样不管是Car还是其他类型,都能快速把Action<T>转成Action<List<T>>,复用性拉满。

内容的提问来源于stack exchange,提问作者Viking

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:12:36