我不知道如何在不使用示例的情况下说出这个问题,所以我们在这里......
我已经定义了这样一个类:
public class Orchestration<T1, T2, T3>
{
使用此构造函数:
public Orchestration(Action<T1, T2, T3> action, int maxNumberOfRetries)
一个名为Run的方法:
public bool Run(T1 one, T2 two, T3 three)
现在,如果我这样做:
var orchestration = new Orchestration<string, string, bool>(File.Copy, 5);
orchestration.Run("c:\filename.txt", "d:\filename.txt", true)
然后业务流程会在返回false之前尝试运行File.Copy 5次,这意味着作业失败了(这里的背景是我试图从一个只能偶尔工作的磁盘中拯救som文件)
Orchestration类是通用的,我可以用它来运行任何有三个参数的方法。
我的问题是:我能否以不需要提前确定参数数量的方式定义Orchestration类?
我的目标是让它能够运行任何方法,而不仅仅是采用三个参数的方法......
答案 0 :(得分:10)
使用C#中的泛型无法做到这一点。这需要与variadic templates in C++类似的东西,但在管理世界中没有相同的东西。这就是为什么诸如Tuple
之类的类具有如此多的不同类以及工厂方法来创建各种版本的原因。
如果您的参数是非泛型的(即:object
)或总是字符串,您可以使用params
来允许可变数量的参数。
答案 1 :(得分:6)
让它接受Action
并关闭您对实际方法的任何参数:
public Orchestration(Action action, int maxNumberOfRetries)
var orchestration = new Orchestration(
() => File.Copy("c:\filename.txt", "d:\filename.txt", true), 5);
这意味着在构造时知道参数值,而不是在调用Run
时,但在这种情况下看起来不应该是一个你无法解决的问题。
答案 2 :(得分:0)
不,你做不到。
查看.NET API中的Tuple
,Action
和Func
...他们必须创建每个需要1的通用类的版本类型参数,带有2个类型参数的等等。
如果你想要一些很酷的东西,试试这个:
static class Extensions {
public static TimesDo( this int x, Action action) {
for (int i = 0; i < x; i++) action.Invoke();
}
}
然后:
int x = 4; x.TimesDo(() => { File.Copy( .... ) } );
或
(5).TimesDo(() => { File.Copy( .... ) });