【问题标题】:Cannot convert lambda expression to type 'System.Delegate' because it is not a delegate type [duplicate]无法将 lambda 表达式转换为类型“System.Delegate”,因为它不是委托类型 [重复]
【发布时间】:2012-07-14 19:07:53
【问题描述】:

我正在开发 VS2008 中的 WPF 应用程序,并决定重用另一个 WPF 应用程序中的一些代码。但是我对以下行有一个奇怪的问题:

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

此代码在原始应用程序中运行良好,但在新应用程序中抛出正常的“无法将 lambda 表达式转换为类型 'System.Delegate',因为它不是委托类型”错误。

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

【问题讨论】:

    标签: c# wpf lambda


    【解决方案1】:

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

    类似:

    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/en-us/library/system.windows.threading.dispatcherextensions.aspx

    【讨论】:

    • 嗨,彼得。感谢你的回答。我在代码中寻找扩展方法;但没有找到。但是我确实找到了一个从 System.Windows.Threading 命名空间链接的 DispatcherExtensions 类。
    • 以防万一其他人感兴趣;添加对 System.Windows.Presentation.dll 的引用包括 DispatcherExtensions 类
    • 嗨奥利弗。酷 - 不知道这门课。我已通过指向课程文档的链接更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多