如何实现可接收方法参数的通用嵌套循环方法并解决调用错误
解决通用嵌套循环方法的委托传递问题
我来帮你搞定这个问题,你的思路非常合理——把重复的嵌套循环逻辑抽成通用方法,通过传入不同的业务方法来复用循环,这正是C#委托的典型应用场景,只是在委托类型选择和调用方式上出了两个小问题,咱们一步步修正:
先解释你遇到的两个错误
- "未为CreateColumns的必需形参PositionX提供实参":你调用
Loop(CreateColumns());的时候加了括号,这会让编译器直接尝试执行CreateColumns方法,但它需要两个double参数,自然会报错。正确的做法是直接传递方法本身(方法组),而不是执行它的结果。 - "Delegate 'Func
' does not take 2 arguments" :你用的Func<ModelObject>是无输入参数、返回ModelObject的委托类型,但你的业务方法需要接收两个double参数,所以得用匹配的泛型Func版本:Func<double, double, ModelObject>——记住,Func委托的最后一个类型参数是返回值类型,前面的都是输入参数的类型。
修正后的通用Loop方法
把委托类型改成匹配业务方法的签名,代码如下:
public static void Loop(Func<double, double, ModelObject> myMethod) { for (double PositionX = 0.0; PositionX <= 12000.0; PositionX += 3000.0) { for (double PositionY = 0.0; PositionY <= 30000.0; PositionY += 6000.0) { // 传入循环变量作为参数调用委托 myMethod(PositionX, PositionY); } } }
正确调用Loop方法
调用时直接传递方法名(方法组),不需要加括号,编译器会自动把它转换成对应的委托:
// 正确调用:传递方法本身,而非执行方法的结果 Loop(CreateColumns);
扩展:支持泛型返回类型
如果以后你的业务方法需要返回不同类型的对象,咱们可以把Loop改成泛型方法,这样就不用为每个返回类型写新的Loop方法了:
public static void Loop<T>(Func<double, double, T> myMethod) { for (double PositionX = 0.0; PositionX <= 12000.0; PositionX += 3000.0) { for (double PositionY = 0.0; PositionY <= 30000.0; PositionY += 6000.0) { myMethod(PositionX, PositionY); } } }
调用时编译器会自动推断返回类型,也可以显式指定:
// 自动推断返回类型为ModelObject Loop(CreateColumns); // 显式指定类型(可选,当编译器无法推断时使用) Loop<ModelObject>(CreateColumns);
额外说明
如果你的某些业务方法是无返回值(void)的,那就要用Action<double, double>委托代替Func,用法和上面一致,只是委托类型不同而已。
内容的提问来源于stack exchange,提问作者Ryan Daley
相关产品推荐
相关产品推荐

