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

Pet*_*tew 6 c# generics

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

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

public class Orchestration<T1, T2, T3>
{
Run Code Online (Sandbox Code Playgroud)

使用此构造函数:

public Orchestration(Action<T1, T2, T3> action, int maxNumberOfRetries)
Run Code Online (Sandbox Code Playgroud)

还有一个名为Run的方法:

public bool Run(T1 one, T2 two, T3 three)
Run Code Online (Sandbox Code Playgroud)

现在,如果我这样做:

var orchestration = new Orchestration<string, string, bool>(File.Copy, 5);
orchestration.Run("c:\filename.txt", "d:\filename.txt", true)
Run Code Online (Sandbox Code Playgroud)

然后业务流程会在返回false之前尝试运行File.Copy 5次,这意味着作业失败了(这里的背景是我试图从一个只能偶尔工作的磁盘中拯救som文件)

Orchestration类是通用的,我可以用它来运行任何有三个参数的方法.

我的问题是:我能否以一种不需要事先确定参数数量的方式定义Orchestration类?

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

Ree*_*sey 10

在C#中使用泛型无法做到这一点.这需要类似于C++中的可变参数模板,但在托管世界中没有相同的功能.这就是为什么类Tuple具有如此多的不同类和工厂方法来创建各种版本的原因.

如果您的参数是非泛型的(即:)object或总是字符串,您可以使用params允许可变数量的参数.


Ser*_*rvy 6

只需让它接受Action并关闭您对实际方法的任何参数:

public Orchestration(Action action, int maxNumberOfRetries)
Run Code Online (Sandbox Code Playgroud)
var orchestration = new Orchestration(
    () => File.Copy("c:\filename.txt", "d:\filename.txt", true), 5);
Run Code Online (Sandbox Code Playgroud)

这意味着在构造时知道参数值,而不是在调用时Run,但在这种情况下看起来不应该是一个你无法解决的问题.