我尝试使用以下重载在Invoke
上调用Dispatcher
:
public object Invoke(Delegate method, params object[] args);
我想使用命名参数,但我似乎无法使用params修饰符找到参数的语法。以下所有内容都无法编译:
dispatcher.Invoke(method: () => { }, args: {});
dispatcher.Invoke(method: () => { }, args: new object[0]);
dispatcher.Invoke(method: () => { }, args: null);
dispatcher.Invoke(method: () => { }, args: new object[] {});
object[] foo = {};
dispatcher.Invoke(method: () => { }, args: foo);
dispatcher.Invoke(method: () => { }, args: new[] {"Hello", "World!"});
我发现这两个问题似乎没有明确的答案:
How to set named argument for string.Format?
所以我的问题是:可以做到吗?如果是,怎么样?
UDPATE
Daniel Hilgarth表明,params
可以与命名参数一起使用。我使用这种模式整合了他的答案:
Action method = () => { };
if (_dispatcher != null)
_dispatcher.Invoke(method: method, args: null);
else
method();
答案 0 :(得分:2)
试一试;
dispatcher.Invoke(method: () => { }, args: new[] {"Hello", "World!"});
答案 1 :(得分:2)
以下代码编译没有问题:
void Main()
{
Invoke(method: () => {}, args: new object[] {});
}
public object Invoke(Action method, params object[] args)
{
return null;
}
我必须将第一个参数的类型从Delegate
更改为Action
才能进行编译,因为() => {}
无法转换为Delegate
。
或者,以下也会编译:
void Main()
{
Action method = () => {};
Invoke(method: method, args: new object[] {});
}
public object Invoke(Delegate method, params object[] args)
{
return null;
}
我的假设是你从未得到关于args
参数的编译错误,但关于method
参数说“无法从'lambda表达式'转换为'System.Delegate'”。通过将lambda转换为Action(Invoke(method: (Action)(() => {}) ...
)或通过定义作为参数传递给方法的类型Action
的变量(见上文)来解决此问题,因为Action
可以隐式转换为Delegate
。