具有动态数量类型的泛型类

时间:2014-04-18 19:55:58

标签: c# generics

我不知道如何在不使用示例的情况下说出这个问题,所以我们在这里......

我已经定义了这样一个类:

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类?

我的目标是让它能够运行任何方法,而不仅仅是采用三个参数的方法......

3 个答案:

答案 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中的TupleActionFunc ...他们必须创建每个需要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( .... ) });