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

Yeo*_*Yeo 6 c# python parameters parameter-passing

生命短暂

def foo(b,a,r):
    # bla bla bla
    pass

mylist = ['b','a','r']
foo(*mylist) 
Run Code Online (Sandbox Code Playgroud)

这就是在Python中将参数列表传递给方法多个位置参数的方式。

但在C#中,我发现了传递一个数组数组的参数使用PARAMS关键字,像这样的:

void foo(params string[] bar)
{
    // bla bla bla
}

string[] mylist = {"b", "a", "r"};
foo(mylist)
Run Code Online (Sandbox Code Playgroud)

想象一下如果我无法触摸该功能,有没有更简单的方法有没有办法做到这一点?

这就是我的意思:

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
Run Code Online (Sandbox Code Playgroud)

我在网上搜索,找不到替代方法。只是想确保我没有错过 C# 提供的隐藏功能。谁知道我们有这样的捷径?

svi*_*ick 3

不,C# 中没有任何功能可以让您直接执行此操作。但您可以使用一些方法来解决这个问题:

  1. 创建一个方法,将具有多个参数的方法转换为具有一个数组参数的方法:

    static Action<T[]> ToArrayMethod<T>(Action<T, T, T> original)
    {
        return array => original(array[0], array[1], array[2]);
    }
    
    Run Code Online (Sandbox Code Playgroud)

    然后像这样使用它:

    string[] array = {"b", "a", "r"};
    
    var arrayFoo = ToArrayMethod(foo);
    
    arrayFoo(array);
    
    Run Code Online (Sandbox Code Playgroud)

    这种方法的缺点是该方法仅适用于具有三个参数且void返回类型的方法。ToArrayMethod()如果您希望它适用于具有 4 个参数的方法或返回某些值的方法,则需要编写另一个重载。

  2. 使用反射。执行此操作时,使用数组传递参数:

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