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

标签 c# python parameters parameter-passing

Life is short

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# 提供的隐藏功能。谁知道我们有这样的捷径?

最佳答案

不可以,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 的方法。如果您希望它适用于具有(例如)4 个参数的方法,或者返回某些值的方法,则您需要编写另一个 ToArrayMethod() 重载。

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

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

关于c# - 将Argument数组传递给C#中的多参数函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9242264/

相关文章:

angularjs - 从非 AngularJS 页面将参数传递到 AngularJS 应用程序

Java 与 C# 类名

c# - 使用 DataContractJsonSerializer 序列化 Dictionary<> 对象

c# - 如何反编译pdb得到C#源码?

python - 检测噪声图像中几乎恒定颜色的垂直矩形

c - 如何从C中的省略号获取不同类型的参数

html - Angular 2。如何在模板中打印来自 @Input() 参数的 HTML 标签?

c# - UWP - 调试器附加到 .exe 但未配置

python - 二叉树的所有元素列表

Python SFTP 下载早于 x 的文件并删除网络存储