Ошибка привязки к методу назначения в C # 3.0 - PullRequest
1 голос
/ 05 октября 2010

Я пытаюсь подключить делегата с помощью отражения.Это то, что я сделал до сих пор

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Data;
using System.Threading;
using System.IO;
using System.Reflection;
using System.Windows;

namespace ChartHelper
{
    public class ICChartHelper
    {        

        public void RefreshChart()
        {
            try
            {   
                Assembly myobj = Assembly.LoadFrom(@"C:\sample.dll");

                foreach (Type mytype in myobj.GetTypes())
                {

                    if (mytype.IsClass == true)
                    {
                        if (mytype.FullName.EndsWith("." + "ICAutomationProxy"))
                        {
                            // create an instance of the object
                            object ClassObj = Activator.CreateInstance(mytype);

               //  var eventTypes = mytype.GetEvents();

                            EventInfo evClick = mytype.GetEvent("OnRefreshCompleted");
                            Type tDelegate = evClick.EventHandlerType;

                            MethodInfo miHandler =
                           typeof(ChartHelper.ICChartHelper)
                           .GetMethod("RefreshApplication",
                            BindingFlags.NonPublic | BindingFlags.Instance);

                            Delegate d = Delegate.CreateDelegate(tDelegate,typeof(ChartHelper.ICChartHelper), miHandler);

                            MethodInfo addHandler = evClick.GetAddMethod();
                            Object[] addHandlerArgs = { d };
                            addHandler.Invoke(ClassObj, addHandlerArgs);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private void RefreshApplication(Object sender, EventArgs e)
        {
            MessageBox.Show("Bingo");
        }

Но в

Delegate d = Delegate.CreateDelegate (tDelegate, typeof (ChartHelper.ICChartHelper), miHandler);

строка, я сталкиваюсь с ошибкой Error binding to target method

Я также нашел обсуждение здесь и попытался решить то же самое, но безуспешно.

Мне нужна помощь, чтобы понять, что я не так делаю?

Спасибо

1 Ответ

3 голосов
/ 05 октября 2010

Ваш метод является методом экземпляра, поэтому вам нужно использовать перегрузку CreateDelegate, которая принимает цель делегата и передает экземпляр декларирующего типа. Например:

Delegate d = Delegate.CreateDelegate(tDelegate, new ICChartHelper(), miHandler);

Обратите внимание, что вам не нужно вызывать GetAddMethod на EventInfo и вызывать это с помощью отражения - вы можете просто использовать EventInfo.AddEventHandler.

...