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。我见过你使用作为进行演员阵容。你试过直接演员吗?是的。两种结果都是一样的。