C# 如何调用委托.Target的.Invoke方法?

C# 如何调用委托.Target的.Invoke方法?,c#,wpf,winforms,delegates,invokerequired,C#,Wpf,Winforms,Delegates,Invokerequired,根据以下方法: public static void ExecuteAsync( this EventHandler eH, object sender, EventArgs eA ) { eH.GetInvocationList( ).Cast<EventHandler>( ).ToList( ).ForEach( e => { e.BeginInvoke( sender, eA, IAR => ( (

根据以下方法:

public static void ExecuteAsync( this EventHandler eH, object sender, EventArgs eA ) {
    eH.GetInvocationList( ).Cast<EventHandler>( ).ToList( ).ForEach( e => {         
        e.BeginInvoke( sender, eA, IAR =>
            ( ( IAR as AsyncResult ).AsyncDelegate as EventHandler ).EndInvoke( IAR ), null );
    } );
}
要确定它是否是WinForms控件,请执行以下操作:

( if e.Target is System.Windows.Controls.Control ){ //Fully Qualified
    ( e.Target as System.Windows.Controls.Control)./*...*/;
}
( if e.Target is System.Windows.Forms.Control ){ //Fully Qualified
    ( e.Target as System.Windows.Forms.Control )./*...*/;
}
该项目参考了几个图书馆:

Microsoft.CSharp
MySql.Data
PresentationFramework
System
System.Configuration
System.Configuration.Install
System.Core
System.Data
System.Data.DataSetExtensions
System.Drawing
System.Management
System.Windows.Forms
System.Xml
System.Xml.Linq

这对你不管用吗。这并不是最优雅的方式,但可以检查目标是WPF还是WinForms控件:

if (e.Target is System.Windows.Controls.Control)
{
    var wpfTarget = ((System.Windows.Controls.Control)e.Target);
    if (wpfTarget.Dispatcher.CheckAccess()) // check if on dispatcher thread
    {
        wpfTarget.Dispatcher.Invoke(/*...*/);
    }

}
else if (e.Target is System.Windows.Forms.Control)
{
    var formsTarget = (System.Windows.Forms.Control)e.Target;
    if (formsTarget.InvokeRequired)
    {
        formsTarget.Invoke(/*...*/);
    }
}
在VisualStudio中,我对
wpfTarget
上的
Dispatcher
提供了智能感知支持:

编辑

下面是我包含的参考资料

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
其中只有四个在使用中:

using System;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Windows;

显示您正在使用的铸造代码,包括所有导入-我猜问题就在那里。@ChrisShain See edit根据提供的数据,我看不出问题是什么。你能提供一个小的、完整的、可复制的示例程序吗?我找到了。我需要引用System.Xaml来访问Dispatcher属性。在其中创建扩展方法的类位于非UI项目中,这就是问题的原因。我从根本上反对使用var,除非这是绝对必要的。无论如何,如果我尝试像上面那样强制转换对象,则结果没有Dispatcher属性。使用VS在您自己的系统上进行的简单测试应该会告诉您。它说:
System.Windows.Controls.Control不包含“Dispatcher”的定义……
我在Visual Studio 2015中编写了它,它具有Dispatcher属性。让我提供一个打印屏幕。至于使用var,它使代码更容易阅读——它不会将您的注意力吸引到实现细节上,而是吸引到算法上。但那只是我个人的感觉,我相信你。不过,我使用的是VS 2013。我见过你使用
作为
进行演员阵容。你试过直接演员吗?是的。两种结果都是一样的。