我有以下代码创建一个匿名类型的实例,该方法作为唯一成员:
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)
。
答案 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
你能做什么呢?
Func<,>
的通用参数。例如:Func<IEnumerable<int>, int>(...)
。