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
相关产品推荐
相关产品推荐

