Poornima Santhosh Ответов: 2

Динамическое событие подписка и отмена подписки на событие C#


Как динамически подписываться и отменять подписку на событие C# в приложении windows Forms. таким образом, учитывая экземпляр объекта и строковое имя, содержащее имя события, вы подписываетесь на это событие и делаете что-то, когда это событие было запущено?

Что я уже пробовал:

_EventHandler строка = строка.Пустой;

_EventHandler = величины + @"." + _EventName;


_EventHandler += новый EventHandler(SaveData);

частная SaveData недействительным(объект отправителя, EventArgs в электронной)
{
// делать что-то
}

Richard MacCutchan

Вам нужно использовать отражение, чтобы найти фактическую ссылку на событие из строки.

2 Ответов

Рейтинг:
18

OriginalGriff

Не так уж и сложно ... просто грязно, потому что тебе нужно поиграть. Попробовать это:

private void AddHandler(Control c, string eventName, EventHandler handler)
    {
    Type t = c.GetType();
    EventInfo ei = t.GetEvent(eventName);
    ei.AddEventHandler(c, handler);
    }
Но я надеюсь, что у вас есть веская причина, потому что это не улучшит читабельность вашего кода...


Poornima Santhosh

Спасибо, что я попробовал это его работа, если у меня есть метод в том же классе.

если у меня есть метод SaveData в другом классе. как я могу добавить его в eventhandler?

OriginalGriff

Если событие не является частью класса, на который оно подписано, вы не можете присоединить его - события так не работают.
Чтобы вызвать обработчик событий, класс, создавший событие, должен очень точно выполнить код для его выполнения:
https://www.codeproject.com/Articles/400287/A-simple-code-snippet-to-add-an-event
Показывает код, который вам нужно использовать в вашем классе, чтобы запустить обработчик.
Если класс не имеет события для запуска, этот код не будет выполняться, и обработчик никогда не будет выполняться.
Вы не можете прикрепить обработчик к событию, которое класс не предоставляет: оно не существует, и обработчик не был бы вызван, если бы вы могли его прикрепить!

Рейтинг:
1

Poornima Santhosh

Привет я получил решение вот мой код

// Код для подписки на событие для вызова другого метода класса
// код для добавления метода в другом классе к управляющему событию
// здесь _EventName-это имя события (Click, Enter, Leave и т. д..)
// В классе MyEventsHandler у меня есть метод SaveData

EventHandler в наличии обработчика ошибок данная процедура = новое EventHandler в(MyEventsHandler.SaveData);
Метод addhandler(величины, _EventName, наличии обработчика ошибок данная процедура);


//Функция для добавления Eventhandler
частный недействительными и addhandler(c контроль, строки имя_события, обработчик EventHandler в )
{
пробовать
{
Тип t = c.GetType();
EventInfo ei = t.GetEvent(имя события);
ei.RemoveEventHandler(c, обработчик);
эй.AddEventHandler(c, обработчик);
}
поймать (исключение бывший)
{
Ящик для сообщений.шоу-система.Отражение.MethodInfo.GetCurrentMethod().Name + "" + ex.Message,
"Ошибка", MessageBoxButtons.Хорошо, MessageBoxIcon.Ошибка);
}
}