无法将lambda表达式转换为类型“System.Delegate”,因为它不是委托类型。

4

我正在使用VS2008开发WPF应用程序,决定重用另一个WPF应用程序的一些代码。然而,我在以下行中遇到了奇怪的问题:

Message.Dispatcher.Invoke(() => { Message.Text = "Looking for orders..."; });

这段代码在原始应用程序中可以正常工作,但在新应用程序中会抛出常见的“无法将lambda表达式转换为类型'System.Delegate',因为它不是委托类型”的错误。

我知道我可以将表达式强制转换为Action以使其正常工作;但我很好奇为什么同一段代码在一个项目中编译并工作,而在另一个项目中却不行。

1个回答

6

旧项目中可能定义了一个扩展方法来处理类型转换!

类似于:

public static void Invoke(this Dispatcher dispatcher, Action action)
{
    dispatcher.Invoke((Delegate)action);
}

那么,您可以轻松地执行以下操作:
Message.Dispatcher.Invoke(() => { Message.Text = "Looking for orders..."; });

更新:
原来 .NET Framework 已经内置了一组针对 Dispatcher 的扩展方法,可以处理这些情况。

http://msdn.microsoft.com/zh-cn/library/system.windows.threading.dispatcherextensions.aspx


嗨,Peter。谢谢你的回答。我在代码中寻找扩展方法,但没有找到。但是我找到了一个DispatcherExtensions类,它与System.Windows.Threading命名空间链接在一起。 - oliver
7
如果有其他人感兴趣的话,增加对System.Windows.Presentation.dll的引用将包括DispatcherExtensions类。 - oliver
嗨,Oliver。很酷 - 我不知道有这个类。我已经更新了答案,并附上了该类的文档链接。 - Peter Hansen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接