调用带有数组的可变参数列表的方法

Calling a method that takes a variable parameter list with an array

考虑这个方法:

public static void InvokeAsync(params object[] arguments)
{
    // do something
}

现在我想用 string[]:

类型的单个参数调用它
InvokeAsync(new string[] { "Test" });

不幸的是,这导致 arguments 成为 string[] 实例和 arguments[1] == "Test"。我需要字符串数组作为 object[] 数组的第一个元素。

我可以使用以下方法解决此问题:

InvokeAsync(new object[] { new string[] { "Test" }});

但这有点违背了 params 声明的目的,而且也不好(而且不明显!)。有没有更好的方法?

这是正确的方法。数组是 covariant in C#,因此存在从 string[]object[] 的隐式转换(这实际上不是类型安全的,请参阅链接文档)并且编译器使用它来将您的 new string[] { "Test" } 视为arguments数组。因此,您需要通过此解决方法向编译器“解释”您的实际需求。

如果您实际上有多个参数,一切都会按预期工作:

InvokeAsync(new string[] { "Test" }, 1);

试试这个方法

public static object InvokeAsync(params object[] arguments)
{
  if (!arguments.GetType().Name.Contains("Object")) arguments = 
                                                     new object[] { arguments };
  return arguments;
}

测试

var result1 =InvokeAsync(new string[] { "Test1","Test2"});
var result2 =InvokeAsync(new string[] { "Test1","Test2"},new string[] { "Test3","Test4"} );
var result3 =InvokeAsync(new string[] { "Test1","Test2"}, 3 );

结果 1

[
  [
    "Test1",
    "Test2"
  ]
]

结果2

[
  [
    "Test1",
    "Test2"
  ],
  [
    "Test3",
    "Test4"
  ]
]

结果 3

[
  [
    "Test1",
    "Test2"
  ],
  1
]