具有可变数量参数的匿名方法

Anonymous method with a variable number of parameters

我有以下代码创建了一个匿名类型的实例,该实例具有一个方法作为唯一的成员:

var test = new { 
    f = new Func<int, int>(x => x)
};

我想实现一个将所有参数相加的函数,无论传递了多少。这是正常方法的样子:

int Sum(params int[] values) { 
    int res = 0;
    foreach(var i in values) res += i;
    return res;
}

但是,我不知道这是否适用于匿名方法。我尝试了 Func<params int[], int>,但显然无法编译。有什么方法可以编写带有可变参数列表或至少带有可选参数的匿名方法吗?

编辑:我想要实现的是这样调用(匿名)求和方法:test.Sum(1, 2, 3, 4).

为了实现这个,首先你需要声明一个委托:

delegate int ParamsDelegate(params int[] args);

然后在分配匿名类型对象的方法 属性 时使用它。

var test = new {
    Sum = new ParamsDelegate(x => x.Sum()) // x is an array
};

那么调用这个方法有两种方式:

1) int sum = test.Sum(new [] { 1, 2, 3, 4 });

2) int sum = test.Sum(1, 2, 3, 4);

我想到的一个选择是简单地使用数组(或任何其他类型的 IEnumerable)作为函数的类型参数:

f = new Func<IEnumerable<int>, int> ( x => foreach(var i in x) ... )

类似于 Dmytro 的方法(我更喜欢它),我们通过创建数组来调用它:

var s = test.f(new[] { 1, 2, 3, 4 });

基本上你的匿名类型不包含方法,而是 Func<,> 类型的 属性。 C# 不支持可变参数泛型,即你不能拥有可变数量参数的泛型。 See.

你可以做什么:

  1. 对于类似聚合的函数,考虑使用 IEnumerable 作为 Func<,> 的通用参数。例如:Func<IEnumerable<int>, int>(...).
  2. 这是workaround可能对您有用的内容。