调用带有数组的可变参数列表的方法
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
]
考虑这个方法:
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
]