无法将匿名方法转换为类型“System.Delegate”,因为它不是委托类型

2024-01-15

我想在 WPF 应用程序的主线程上执行此代码并收到错误,我无法弄清楚出了什么问题:

private void AddLog(string logItem)
        {

            this.Dispatcher.BeginInvoke(
                delegate()
                    {
                        this.Log.Add(new KeyValuePair<string, string>(DateTime.Now.ToLongTimeString(), logItem));

                    });
        }

匿名函数(lambda 表达式和匿名方法)必须转换为specific委托类型,而Dispatcher.BeginInvoke只需要Delegate。对此有两种选择...

  1. 还是用现有的BeginInvoke调用,但指定委托类型。这里有多种方法,但我通常将匿名函数提取到前面的语句中:

    Action action = delegate() { 
         this.Log.Add(...);
    };
    Dispatcher.BeginInvoke(action);
    
  2. 写一个扩展方法Dispatcher这需要Action代替Delegate:

    public static void BeginInvokeAction(this Dispatcher dispatcher,
                                         Action action) 
    {
        Dispatcher.BeginInvoke(action);
    }
    

    然后你可以通过隐式转换调用扩展方法

    this.Dispatcher.BeginInvokeAction(
            delegate()
            {
                this.Log.Add(...);
            });
    

一般来说,我还鼓励您使用 lambda 表达式而不是匿名方法:

Dispatcher.BeginInvokeAction(() => this.Log.Add(...));

编辑:正如评论中所述,Dispatcher.BeginInvoke在 .NET 4.5 中获得了重载,这需要Action直接,所以在这种情况下你不需要扩展方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法将匿名方法转换为类型“System.Delegate”,因为它不是委托类型 的相关文章

随机推荐