我有以下代码:
public doSomething(List<Int64> data, Int64 counter){
//Do something
}
public doSomethingNext(List<Int64> data, String Something){
//Do something next
}
public static void Loop<T>(Action<T> action) {
//Do something before
action(T);
}
}
是否可以以通用的方式编写Loop方法,无论方法的参数如何,我都可以传递每个方法。像这样:
Loop(doSomething,....?);
Loop(doSomethingNext,...?);
@Edit 19:40 24-06-2015更多信息
对不起'行动(T);' part产生T未知的错误。但是我填写了它,因为我不知道如何使这项工作。
当我使用以下代码时,它适用于Linq:
//Method
public static void Loop(Action action) {
//Do something before
action();
}
}
//Call
Loop(() => doSomething(data, counter));
但是我很好奇它是否也可以在没有Linq的情况下工作? (类似于&lt; T&gt;)
(一个侧面问题,是否可以在Loop函数中访问方法的参数?)
答案 0 :(得分:3)
您可以将Delegate
...作为参数:
public static void Loop<T>(Delegate action) {
}
然后你必须
action.DynamicInvoke(someparameters);
所以使用反射来调用它......你会使用什么参数?
通常,如果参数是&#34;固定&#34;和#34;选择&#34;通过调用者,partial application:
解决了这个问题public static void Loop(Action action)
{
action();
}
你就像使用它一样:
Loop(() => Console.WriteLine("Hello"));
此处Console.WriteLine()
有一个参数,但调用者通过创建另一个方法(匿名方法)来修复它,该方法具有0个参数,从中创建类型为Action
的委托。
您不需要从代理中删除所有参数:
public static void Loop<T>(Action<T> action)
{
// generate some T value
T value = GetValue<T>();
// call action with a T parameter
action(value);
}
然后:
Loop((int x) => Console.WriteLine("Some number: {0}", x));
在这种情况下,Console.WriteLine()
使用了两个参数,其中一个已修复("Some number: {0}"
),另一个保持真正变量(x
)。
答案 1 :(得分:2)
调用Loop时使用lambda方法将方法转换为Action:
Loop(t => doSomething(t, counter));
Loop(t => doSomethingNext(t, Something));