通行动< ..,..,T> as参数没有预定义数量的动作参数

时间:2015-06-24 13:35:53

标签: c# generic-programming

我有以下代码:

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函数中访问方法的参数?)

2 个答案:

答案 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));