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

C#循环中间存在差异时如何避免代码重复及参数传递问题

解决方案

你需要调整GenerateDocument的委托参数,让它能接收循环内的page和i,同时利用闭包捕获调用方的docA/docB。具体实现如下:

1. 修改公共生成函数的委托类型

把原来无参数的Action改成带参数的泛型委托,用来传递循环中生成的page和页码i(注意把Page替换成你实际的页面类型):

void GenerateDocument(Action<Page, int> specificCode)
{
    OpenDocumentCode();
    for (int i = 0; i < pageCount; i++)
    {
        // 公共的每页处理代码,比如生成page对象
        var page = ...; // 你的实际page生成逻辑
        specificCode(page, i); // 将page和i传递给特定业务代码
    }
    CloseDocumentCode();
}

2. 在调用方用闭包捕获文档对象

在GenerateDocumentA和GenerateDocumentB中,用lambda表达式捕获外部的docA/docB,同时接收page和i参数:

void GenerateDocumentA(DocumentA docA)
{
    GenerateDocument((page, i) => SpecificCodeA(docA, page, i));
}

void GenerateDocumentB(DocumentB docB)
{
    GenerateDocument((page, i) => SpecificCodeB(docB, page, i));
}

原理说明

  • 泛型Action<Page, int>明确了委托需要接收的参数,完美匹配SpecificCodeA/B对page和i的需求。
  • lambda表达式会自动捕获所在作用域的docA/docB变量(闭包特性),这样委托执行时就能直接访问到这些外部对象。

完整代码示例

假设Page是页面的实际类型,pageCount是已定义的全局/局部变量:

// 公共文档生成逻辑
void GenerateDocument(Action<Page, int> specificCode)
{
    OpenDocumentCode();
    for (int i = 0; i < pageCount; i++)
    {
        var page = new Page(i); // 示例:创建页面实例
        specificCode(page, i);
    }
    CloseDocumentCode();
}

// 针对DocumentA的生成方法
void GenerateDocumentA(DocumentA docA)
{
    GenerateDocument((page, i) => SpecificCodeA(docA, page, i));
}

// 针对DocumentB的生成方法
void GenerateDocumentB(DocumentB docB)
{
    GenerateDocument((page, i) => SpecificCodeB(docB, page, i));
}

// 示例业务代码
void SpecificCodeA(DocumentA docA, Page page, int pageIndex)
{
    // 处理DocumentA的页面逻辑,比如插入内容、设置格式等
}

void SpecificCodeB(DocumentB docB, Page page, int pageIndex)
{
    // 处理DocumentB的页面逻辑
}

// 公共辅助方法
void OpenDocumentCode() { /* 打开文档的公共逻辑 */ }
void CloseDocumentCode() { /* 关闭文档的公共逻辑 */ }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:41:35