Выполнить список методов, переданных в качестве параметра функции - PullRequest
1 голос
/ 22 января 2020

Я хотел бы добиться такой следующей функции:

public void MyMethod<T>(params Func<T[], void>[] funcs)
{
   foreach (var func in funcs)
   {
      func();
   }
}

public void Print1<T>(params T[] objs)
{
   Console.WriteLine("==== I am in 1 ====");
}

public void Print2<T>(params T[] objs)
{
   Console.WriteLine("==== I am in 2 ====");
}

static void Main()
{
   MyMethod(
      Print1(1, 2, 3),
      Print2("1", "2", "3"),
   );
}

, ожидающей выполнения вывода:

==== I am in 1 ====
==== I am in 2 ====

На данный момент мне удалось вот что:

public void MyMethod2(params Action<object>[] funcs)
{
   foreach (var func in funcs)
   {
      Execute(func);
    }
 }

 public Action<object> Print1<T>(params T[] objs)
 {
     PrintLog("==== I am in 1 ====");
     return null;
 }

 public Action<object> Print2<T>(params T[] objs)
 {
     PrintLog("==== I am in 2 ====");
     return null;
 }

 public class MyDelegateCommand : ICommand
 {
    public MyDelegateCommand(Action<object> executeAction) => _executeAction = executeAction;
    private readonly Action<object> _executeAction;
    public void Execute(object parameter) => _executeAction?.Invoke(parameter);
 }

но проблема в том, что меня печатают дважды, например:

==== I am in 1 ====
==== I am in 2 ====
==== I am in 1 ====
==== I am in 2 ====

Я думаю, что причина этого второго подхода в том, что object из Actioon<object> не передается / возвращается, но я все равно спрашиваю меня, не будет ли лучше справиться с этим первым подходом, который я запрашиваю. Любая идея, как я мог решить эту проблему?

Заранее спасибо за любую помощь!

1 Ответ

2 голосов
/ 22 января 2020

Похоже, что вы хотите:

public static void MyMethod(params Action[] funcs)
{
   foreach (var func in funcs)
   {
      func();
   }
}

public static void Print1<T>(params T[] objs)
{
   Console.WriteLine("==== I am in 1 ====");
}

public static void Print2<T>(params T[] objs)
{
   Console.WriteLine("==== I am in 2 ====");
}

static void Main()
{
   MyMethod(
      () => Print1(1, 2, 3),
      () => Print2("1", "2", "3")
   );
}

В частности: <T> не является общим для двух вызовов, поэтому он не может быть обобщенным c on MyMethod; штраф в Print1<T> и Print2<T>, хотя, как соответствующий <T> указан (подразумевается) в лямбда-выражении.

...