Может ли действие обратного вызова принимать разные аргументы в c #? - PullRequest
0 голосов
/ 09 мая 2019

Не знаю, возможно ли на 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 голосов
/ 09 мая 2019

Нет, один делегат не может иметь изменяющийся список аргументов.

Простое решение - заставить ваш обратный вызов принять null / nullable для аргументов, которых у вас нет:

 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());
...