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

时间:2010-01-07 20:48:01

标签: c# python

在python中,*允许我将列表作为函数参数传递:

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

我可以使用数组在C#中复制此行为吗?

感谢。

4 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:9)

除了:

  1. 更改方法签名以接受数组
  2. 添加接受数组的重载,提取值并调用原始重载
  3. 使用反射来调用方法
  4. 然后不幸的是,不,你不能那样做。

    在.NET中不支持基于关键字和基于位置的参数传递,除了通过反射。

    请注意,为什么不支持这一点可能有几个很好的理由,但我想到的只是“为什么你需要这样做?”。通常,当您将方法包装在另一个层中时,您只使用此模式,而在.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 });
            }
        }
    }
    

答案 2 :(得分:2)

你可以使用反射。但是,如果它是一个可变长度,你可能最好使用数组作为方法防御,但是你仍然需要解析列表,除非它是一个可以通过集合方法/数组方法处理的基本需求。

答案 3 :(得分:1)

我很确定您可以使用反射来访问您的方法,然后使用您的数组作为参数列表使用Invoke。但是,有点圆了。