5

我正在尝试使用以下重载调用Invokea :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!"});

我发现这两个问题似乎没有明确的答案:

带参数的命名参数

如何为 string.Format 设置命名参数?

所以我的问题是:能不能做到?如果是,如何?

UDPATE

Daniel Hilgarth 表明 yesparams可以与命名参数一起使用。我使用这种模式整合了他的答案:

Action method = () => { };
if (_dispatcher != null)
    _dispatcher.Invoke(method: method, args: null);
else
    method();
4

2 回答 2

2

试试;

dispatcher.Invoke(method: () => { }, args: new[] {"Hello", "World!"});
于 2012-04-13T13:49:27.713 回答
2

以下代码编译没有问题:

void Main()
{
    Invoke(method: () => {}, args: new object[] {});
}

public object Invoke(Action method, params object[] args)
{
    return null;
}

我不得不将第一个参数的类型从Delegateto更改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.

于 2012-04-13T13:54:54.917 回答