回调动作可以在c#中采用不同的参数吗?

时间:2019-05-09 18:29:24

标签: c# callback delegates action

不知道在c#上是否可能有一个采用不同参数的回调。

public void Woof(){
   Console.WriteLine("woof");
}
public void Woof(System.Action callback){
   Console.WriteLine("woof");
   callback();
}

public void Foo(System.Action callback){
   callback();
   callback(()=> SomeOtherFunction());
}

public void TheCaller(){
   Foo(Woof());
}

我知道这段代码无法正常工作,但是有没有办法完成我想要的?

1 个答案:

答案 0 :(得分:0)

不,单个委托不能有不同的参数列表。

简单的解决方案-使您的回调函数接受null /对于您没有的参数为空:

 public void Foo(Action<Action> callbackWithOptionalArg)
 {
      callbackWithOptionalArg(null);
      callbackWithOptionalArg(() => SomeOtherFunction());
 }

 Foo( optionalAction => optionalAction == null ? Woof() : Wool(optionalAction));

替代方法-具有以多种方法作为参数的接口:

interface IWoof
{
   void Woof();
   void Woof(System.Action callback)
}

public void Foo(IWoof dog)
{
  dog.Woof();
  dog.Woof(() => SomeOtherFunction());
}

class MyWoof : IWoof
{
  public void Woof(){
   Console.WriteLine("woof");
  }
  public void Woof(System.Action callback){
    Console.WriteLine("woof with callback");
    callback();
  }
}

Foo(new MyWoof());