【发布时间】:2015-12-10 02:25:27
【问题描述】:
给定以下方法:
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 );
} );
}
我注意到e 有一个属性 Target。
当我进一步研究它时,我发现我可以检查是e.Target is System.Windows.Controls.Control 还是e.Target is System.Windows.Forms.Control。
这太棒了,因为在使用这个扩展的情况下,为了方便(而且我很懒),我希望能够判断委托目标是否需要调用委托(在WinForms:Control.Invoke( foo );在 WPF 的情况下:Control.Dispatcher.Invoke( foo ))。
我不需要知道如何将对象转换为它的实际类型(我可以没有它):我只需要知道如何转换对象以便我可以访问InvokeRequired属性和Invoke 方法(在WinForms 控件的情况下),或Dispatcher 属性(用于访问Dispatcher.CheckAccess( ) 函数和Dispatcher.Invoke( ) 方法)。
这可能吗?我该怎么做呢? (我尝试将 e.Target 转换为 System.Windows.Control.Control,但结果没有 Dispatcher 属性)。
编辑
根据对转换代码(和导入/引用)的要求:
判断是否为WPF控件:
( if e.Target is System.Windows.Controls.Control ){ //Fully Qualified
( e.Target as System.Windows.Controls.Control)./*...*/;
}
判断是否为WinForms控件:
( 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
【问题讨论】:
-
显示您正在使用的转换代码,包括所有导入 - 我猜问题出在那儿。
-
@ChrisShain 查看编辑
-
从提供的数据看不出问题出在哪里。能否提供一个小型、完整、可重现的示例程序?
-
我找到了。我需要引用 System.Xaml 来访问 Dispatcher 属性。创建扩展方法的类位于非 UI 项目中,这就是问题所在。谢谢
标签: c# wpf winforms delegates invokerequired