如何传递一个带有可选参数的方法作为参数?
ClassA
说,我们有ClassA
,方法Foo
包含一个可选参数。 所以,我们可以像DoFoo
方法DoFoo
使用它。
public class ClassA { public ClassA() { } public void Foo(bool flag = true) { } public void DoFoo() { Foo(); // == Foo(true); } }
一旦我需要将它传递给另一个ClassB
类。 首先我尝试将其作为Action
传递,但签名肯定不匹配。 然后我将其作为Action
传递,签名匹配,但ClassB
中的参数不再是可选的。 但我确实希望让它可选,并想出一个委托代表的想法。 所以,它奏效了。
public delegate void FooMethod(bool flag = true); public class ClassB { Action Foo1; FooMethod Foo2; public ClassB(Action _Foo1, FooMethod _Foo2) { Foo1 = _Foo1; Foo2 = _Foo2; } public void DoFoo() { Foo1(true); Foo2(); // == Foo2(true); }
所以,问题是:我可以以某种方式传递一个带有可选参数的方法作为参数,而无需明确声明委托并保持其参数的可选质量吗?
所以,问题是:我可以以某种方式传递一个带有可选参数的方法作为参数,而无需明确声明委托并保持其参数的可选质量吗?
不可以。“可选性”是方法签名的一部分,编译器需要在编译时知道它以提供默认值。 如果您使用的是没有可选参数的委托类型, 那么当您尝试在没有足够参数的情况下调用它时,编译器应该做什么?
最简单的方法可能是包装它:
CallMethod(() => Foo()); // Compiler will use default within the lambda. ... public void Foo(bool x = true) { ... } public void CallMethod(Action action) { ... }