C#,传递数组作为函数参数

问题描述:

在Python *允许我传递一个列表,功能参数:C#,传递数组作为函数参数

def add(a,b): return a+b 
x = [1,2] 
add(*x) 

我可以复制在C#这种行为与阵列?

谢谢。

不测:

  1. 改变方法签名接受阵列
  2. 添加接受阵列的过载,提取值和呼叫原始过载
  3. 使用反射调用方法

然后很不幸,不,你不能那样做。

.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 }); 
     } 
    } 
} 
+0

Upvoted这一个,而不是params解决方案,因为它更正确地匹配问题。如果问题问如何转换一个函数,如“def add(* numbers):” – 2010-01-07 20:59:11

+0

谢谢,params解决方案将是正确的。这与我所寻找的最接近,因为我无法修改方法签名。有时间阅读C#和反思,但是,这听起来像我应该重构我的方法。 – Mark 2010-01-07 20:59:15

+0

只有当你不能改变签名时,并且只有当你真的*必须*将值作为数组传递时。无论如何,你为什么要这样做? – 2010-01-07 21:02:32

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可能会更好,但是,除非可以通过集合方法/数组方法处理基本需求,否则仍然需要解析列表。

我相当肯定你可以使用反射来访问你的方法,然后使用Invoke,使用你的数组作为参数列表。尽管如此,那种圆润的感觉。