在C#中将数组参数传递给多个参数函数

6 投票
5 回答
4243 浏览
提问于 2025-04-17 12:51

生命短暂

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#没有直接支持这个功能的选项。不过,有一些方法可以绕过这个限制:

  1. 你可以创建一个方法,把多个参数的方法转换成一个只用数组作为参数的方法:

    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()的重载。

  2. 使用反射。这样做时,参数是通过数组传递的:

    var foo = typeof(SomeType)
        .GetMethod("foo", BindingFlags.Instance | BindingFlags.NonPublic);
    
    object[] array = {"b", "a", "r"};
    
    foo.Invoke(somTypeInstance, array);
    

撰写回答