Как через Reflection привязать событие ?

Язык C#: программирование на C#, портирование кода C# на VB и VB на C#.

Модератор: Ramzes

student-uni
Бывалый
Бывалый
 
Сообщения: 242
Зарегистрирован: 01.10.2005 (Сб) 18:54

Как через Reflection привязать событие ?

Сообщение student-uni » 02.09.2009 (Ср) 10:47

Задача - сделать так чтоб пользователь мог сам привязывать события к элементам.
Обработчики событий поставляются в DLL.
Подключая ту или иную DLL с набором функций пользователь должен таким образом сам определять что будет делать кнопка по нажатию,
прицепив на обработчик события Click функцию из DLL.

Механизм прицепления и необходимо разработать.

Как пример берем кнопку. Кнопку кстати тоже делаем динамически:

Код: Выделить всё
            Assembly a = Assembly.Load("System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
            AssemblyName an = a.GetName();
            Type tButton = Type.GetType("System.Windows.Forms.Button," + an.FullName, true);
            //Type tButton = typeof(Type.GetType("System.Windows.Forms.Button"));
            Object btnCancel = Activator.CreateInstance(tButton);
            btnCancel.GetType().GetProperty("Text").SetValue(btnCancel,Language.Cancel, null);
            btnCancel.GetType().GetProperty("Top").SetValue(btnCancel, 400, null);
            btnCancel.GetType().GetProperty("Left").SetValue(btnCancel, 400, null);


Функцию Click помещаем в класс Action который помещаем в свою очередь в DLL.

Код: Выделить всё
namespace Implements
{
public class Actions
    {
        public void Cancel_Click(object sender, EventArgs e)
        {
            MessageBox.Show("The method Cancel1 is not implemented.");
        }
    }
}


Теперь осталось загрузить эту DLL динамически, найти через Reflection функцию Cancel_Click и привязать её к кнопке:

Код: Выделить всё
        Assembly b = Assembly.LoadFile(@"..\..\MMImplements\bin\Debug\MMImplements.dll");
            AssemblyName bn = b.GetName();
            Type tAction = Type.GetType("Implements.Actions," + bn.FullName, true);
            Object oAction = Activator.CreateInstance(tAction);

и вот тут непонятно как дальше
Должно быть где-то так:

Код: Выделить всё
     btnCancel.GetType().GetEvent("Click").AddEventHandler(btnCancel, new EventHandler(oAction.GetType().GetMethod("Cancel_Click").))

Но так не работает, ошибка:"не указано имя функции, хотя оно указано"

Кстати попытка вызвать функцию тоже не проходит

Код: Выделить всё
            MethodInfo mi = oAction.GetType().GetMethod("Cancel_Click");
            ParameterInfo[] myParameters = mi.GetParameters();

Ошибка: ParameterInfo не может быть преобразован в EventArgs" хотя EventArgs стоит вторым елементом в массиве.

в Чем причина и как же привязать событие ?

Спасибо

student-uni
Бывалый
Бывалый
 
Сообщения: 242
Зарегистрирован: 01.10.2005 (Сб) 18:54

Re: Как через Reflection привязать событие ?

Сообщение student-uni » 02.09.2009 (Ср) 14:58

1.
Код: Выделить всё
btnCancel.GetType().GetEvent("Click").AddEventHandler(btnCancel, EventHandler.CreateDelegate(ty, mi));

2.
Код: Выделить всё
   public  class Actions//:IActions
    {

        #region IActions Members

        public static void Save_Click(object sender, EventArgs e)
        {
            throw new Exception("The method  Save1 is not implemented.");
        }

        public static void Cancel_Click(object sender, EventArgs e)
        {
            throw new Exception("The method Cancel1 is not implemented.");
        }

решило проблему,

но теперь нельзя наследовать интерфейс :-(

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Re: Как через Reflection привязать событие ?

Сообщение Ramzes » 04.09.2009 (Пт) 12:17

Было у меня, поищи по форуму, там Sebas рассказывал, как через CallBack сделать аналог событий.


Вернуться в C#

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

    TopList