执行作为函数参数传递的方法列表

Execute a list of methods passed as parameter of a function

我想实现这样一个功能:

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 ====

我认为第二种方法的原因是因为 Actioon<object>object 不是 passed/returned,但我还是问我是否更好地管理它与我要求的第一种方法。知道如何解决这个问题吗?

在此先感谢您的帮助!

看起来你想要:

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> 在两个调用之间不通用,因此它不能在 MyMethod 上通用;不过在 Print1<T>Print2<T> 中很好,因为在 lambda 中指定(隐含)了相应的 <T>