C#,传递数组作为函数参数
问题描述:
在Python *允许我传递一个列表,功能参数:C#,传递数组作为函数参数
def add(a,b): return a+b
x = [1,2]
add(*x)
我可以复制在C#这种行为与阵列?
谢谢。
答
不测:
- 改变方法签名接受阵列
- 添加接受阵列的过载,提取值和呼叫原始过载
- 使用反射调用方法
然后很不幸,不,你不能那样做。
.NET中不支持基于关键字和基于位置的参数传递,就像在Python中一样,除了通过反射之外。
请注意,为什么这不被支持可能有几个很好的理由,但我想到的是“为什么你需要这样做?”。通常情况下,只有在将该方法包装到另一个图层中时才使用此模式,而在.NET中,您已强制键入代表,因此通常只剩下基于反射的代码,即便如此,您通常也会对方法被调用。所以我的直觉反应,即使我回答你的问题,是你不应该这样做,并找到一个更好,更友善的方式来实现你想要的东西。
下面是一个例子使用反射:
using System;
using System.Reflection;
namespace ConsoleApplication1
{
class Program
{
public Int32 Add(Int32 a, Int32 b) { return a + b; }
static void Main(string[] args)
{
Program obj = new Program();
MethodInfo m = obj.GetType().GetMethod("Add");
Int32 result = (Int32)m.Invoke(obj, new Object[] { 1, 2 });
}
}
}
答
的params关键字允许类似的东西
public int Add(params int[] numbers) {
int result = 0;
foreach (int i in numbers) {
result += i;
}
return result;
}
// to call:
int result = Add(1, 2, 3, 4);
// you can also use an array directly
int result = Add(new int[] { 1, 2, 3, 4});
答
你可以使用反射。然而,如果它总是可变长度,那么使用数组作为方法defenition可能会更好,但是,除非可以通过集合方法/数组方法处理基本需求,否则仍然需要解析列表。
Upvoted这一个,而不是params解决方案,因为它更正确地匹配问题。如果问题问如何转换一个函数,如“def add(* numbers):” – 2010-01-07 20:59:11
谢谢,params解决方案将是正确的。这与我所寻找的最接近,因为我无法修改方法签名。有时间阅读C#和反思,但是,这听起来像我应该重构我的方法。 – Mark 2010-01-07 20:59:15
只有当你不能改变签名时,并且只有当你真的*必须*将值作为数组传递时。无论如何,你为什么要这样做? – 2010-01-07 21:02:32