在python中,*允许我将列表作为函数参数传递:
def add(a,b): return a+b
x = [1,2]
add(*x)
我可以使用数组在C#中复制此行为吗?
感谢。
答案 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)
除了:
然后不幸的是,不,你不能那样做。
在.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。但是,有点圆了。