执行作为函数参数传递的方法列表
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>
。
我想实现这样一个功能:
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>
。