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

时间:2015-10-23 11:04:46

标签: c# lambda anonymous-function params

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

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>,但显然不会编译。有没有办法用变量参数列表编写匿名方法,或者至少使用可选的args?

编辑:我想要实现的是调用(匿名)sum方法,如下所示:test.Sum(1, 2, 3, 4)

3 个答案:

答案 0 :(得分:5)

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

delegate int ParamsDelegate(params int[] args);

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

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

答案 1 :(得分:1)

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

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

Simlar对Dmytro(我更喜欢)的appraoch我们会通过创建一个数组来调用它:

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

答案 2 :(得分:1)

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

你能做什么呢?

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