如何通过循环向对象添加多个同类型成员?
在链式调用中批量添加成员的可行方案
你尝试的直接在链式调用中间插入foreach的写法在C#语法上是不允许的,因为链式调用依赖连续的表达式返回对象,而foreach是语句而非表达式。以下是几种可行的实现方式:
1. 拆分链式调用,先循环再收尾
先将链式前半段的实例保存到变量,循环中持续调用WithLine更新实例,最后完成链式调用:
// 初始化基础实例 var transactionBuilder = new Transaction(arg1, arg2) .WithHeader("Header Thing 1", "Header Thing 2"); // 循环添加所有Line foreach (var line in Lines) { transactionBuilder = transactionBuilder.WithLine(line.LineNum, line.LineDetail); } // 完成创建 var transaction = transactionBuilder.Create();
2. 封装批量添加的扩展方法
如果可以自定义扩展,新增一个批量添加Line的方法,把循环逻辑封装起来,保持链式风格:
// 定义扩展方法 public static class TransactionExtensions { public static Transaction WithLines(this Transaction transaction, IEnumerable<Line> lines) { foreach (var line in lines) { transaction.WithLine(line.LineNum, line.LineDetail); } return transaction; } } // 链式调用批量方法 var transaction = new Transaction(arg1, arg2) .WithHeader("Header Thing 1", "Header Thing 2") .WithLines(Lines) // 直接批量添加 .Create();
3. 使用LINQ的Aggregate方法(函数式风格)
借助LINQ的Aggregate方法,在一行代码内完成遍历和累加调用:
var transaction = Lines.Aggregate( // 初始实例 new Transaction(arg1, arg2).WithHeader("Header Thing 1", "Header Thing 2"), // 遍历每个Line,更新实例 (builder, line) => builder.WithLine(line.LineNum, line.LineDetail)) .Create();
关键注意点
以上所有方法的前提是:Transaction的WithLine方法是fluent接口设计(即返回当前Transaction实例)。如果WithLine是void返回类型,需要先调整Transaction的方法设计,让其返回自身;或者改为通过内部集合存储Line,最后统一构建。
内容的提问来源于stack exchange,提问作者CactusCake
相关产品推荐
相关产品推荐

