在C#中将数组参数传递给多个参数函数
生命短暂
def foo(b,a,r):
# bla bla bla
pass
mylist = ['b','a','r']
foo(*mylist)
这就是在Python中如何将一个参数列表传递给方法的多个位置参数。
但在C#中,我发现可以使用params关键字将一个数组传递给一个数组参数,像这样:
void foo(params string[] bar)
{
// bla bla bla
}
string[] mylist = {"b", "a", "r"};
foo(mylist)
想象一下,如果我不能修改这个函数,有没有更简单的方法?有没有什么方法可以做到这一点?
我想表达的是:
void foo (string b, string a, string r)
{
// bla bla bla
}
string[] mylist = {"b", "a", "r"};
foo(mylist[0],mylist[1],mylist[2]); // This line makes my life difficult
我在网上搜索过,但没有找到替代方案。只是想确认我没有错过C#提供的隐藏功能。谁知道有没有这样的快捷方式呢?
5 个回答
1
使用静态语言有一些缺点,这就是其中之一。如果你的函数定义是这样的:
void foo (string a, string b, string c);
那么你就必须传入三个单独的字符串。
foo(mylist[0],mylist[1],mylist[2]);
在C#中,唯一能让输入更灵活的方法是使用params,你应该已经知道这个,或者使用默认值(C# 4.0):
void foo (string a, string b = null, string c = null)
这意味着如果我不传入b或c,就把它们设为null,现在你可以这样调用你的函数:
foo(mylist[0])
1
你可以使用反射技术;不过,通常不推荐这样做,因为这会让你失去编译时的类型安全检查。
下面是一个示例方法:
string[] mylist = { "b", "a", "r" };
((Action<string,string,string>)foo).DynamicInvoke(mylist);
3
不,C#没有直接支持这个功能的选项。不过,有一些方法可以绕过这个限制:
你可以创建一个方法,把多个参数的方法转换成一个只用数组作为参数的方法:
static Action<T[]> ToArrayMethod<T>(Action<T, T, T> original) { return array => original(array[0], array[1], array[2]); }
然后可以这样使用它:
string[] array = {"b", "a", "r"}; var arrayFoo = ToArrayMethod(foo); arrayFoo(array);
不过,这种方法有个缺点,就是它只能用于恰好有三个参数并且返回类型是
void
的方法。如果你想让它适用于四个参数的方法,或者那些有返回值的方法,你就需要再写一个ToArrayMethod()
的重载。使用反射。这样做时,参数是通过数组传递的:
var foo = typeof(SomeType) .GetMethod("foo", BindingFlags.Instance | BindingFlags.NonPublic); object[] array = {"b", "a", "r"}; foo.Invoke(somTypeInstance, array);