C#中类方法批量执行的实现方案与必要性问询
问题B:C#中怎么实现?
在C#里不能直接把方法放进List<Object>然后调用,因为Object没有对应的调用签名。我们需要用委托来定义方法的签名,这里的方法都是int(int, int)的形式,直接用C#内置的Func<int, int, int>委托就很方便。
具体实现步骤:
- 用
List<Func<int, int, int>>来存储你的私有方法,因为这个委托正好匹配「输入两个int,返回int」的签名。 - 在类的构造函数(或者静态初始化块,如果是静态方法的话)里,直接把私有方法添加到列表中——类内部可以直接引用私有方法名,C#会自动把它转换为委托实例。
- 循环遍历列表,调用每个委托即可。
完整可运行的代码示例:
public class OperationProcessor { // 存储所有操作方法的列表,用强类型委托 private readonly List<Func<int, int, int>> _operationMethods = new(); public OperationProcessor() { // 直接添加私有方法,自动转换为委托 _operationMethods.Add(X); _operationMethods.Add(Y); _operationMethods.Add(Z); } // 原有的私有方法 private int X(int a, int b) => a + b; private int Y(int a, int b) => a - b; private int Z(int a, int b) => a * b; public void ProcessWithList(int a, int b) { int acc = 0; foreach (var operation in _operationMethods) { int currentResult = operation(a, b); // 示例1:累加结果 acc += currentResult; // 示例2:如果需要替换为取最大值,注释上面一行,打开下面的逻辑 // if (currentResult > acc) // acc = currentResult; } Console.WriteLine($"最终处理结果:{acc}"); } } // 调用示例 // var processor = new OperationProcessor(); // processor.ProcessWithList(2, 3);
额外说明:
- 为什么不能用
List<Object>?因为Object是所有类型的基类,但它没有(int, int)的调用签名,编译器根本不知道怎么执行j(a,b)。而委托是强类型的,明确了方法的输入输出,所以能安全、直接地调用。 - 如果你的结果处理逻辑也需要灵活切换,甚至可以把处理逻辑也做成委托参数传入
ProcessWithList,比如:
public void ProcessWithList(int a, int b, Func<int, int, int> resultHandler) { int acc = 0; foreach (var operation in _operationMethods) { acc = resultHandler(acc, operation(a, b)); } Console.WriteLine($"最终处理结果:{acc}"); } // 调用时可以传入累加逻辑: // processor.ProcessWithList(2, 3, (currentAcc, newVal) => currentAcc + newVal); // 或者传入取最大值逻辑: // processor.ProcessWithList(2, 3, (currentAcc, newVal) => Math.Max(currentAcc, newVal));
这样扩展性就更强了,完全不用修改方法内部的循环逻辑。
内容的提问来源于stack exchange,提问作者Logan McManus
相关产品推荐
相关产品推荐

