Как я могу вызвать метод.Invoke для Delegate.Target?

Учитывая следующий метод:

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 to 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

1 ответ

Решение

Разве это не работает для вас. Это не самый элегантный способ, но он проверяет, является ли целью элемент управления 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 у меня есть поддержка Intelisense для Dispatcher на wpfTarget:

РЕДАКТИРОВАТЬ

Ниже ссылки, которые я включил

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;
Другие вопросы по тегам