Я знаю о EventInfo.AddEventHandler(...)
методе, который можно использовать для прикрепления обработчика к событию. Но что делать, если я не могу даже определить правильную сигнатуру обработчика события, как, например, у меня даже нет ссылки на аргументы события, ожидаемые обработчиком?
Я объясню проблему с правильным кодом.
// Сценарий, когда в моем решении есть все, сценарий нулевого отражения.
internal class SendCommentsManager
{
public void Customize(IRFQWindowManager rfqWindowManager)
{
rfqWindowManager.SendComment += HandleRfqSendComment;
}
private void HandleRfqSendComment(object sender, SendCommentEventArgs args)
{
args.Cancel = true;
}
}
Теперь я хочу достичь той же цели, используя отражение. Мне удалось выяснить большую часть этого, но когда я присоединяю делегата к событию (используя AddEventHandler
), он генерирует исключение "Error binding to target method."
.
Я понимаю причину этого исключения, связывая неправильного делегата с событием. Но должен быть какой-то способ достичь этого.
internal class SendCommentsManagerUsingReflection
{
public void Customize(IRFQWindowManager rfqWindowManager)
{
EventInfo eventInfo = rfqWindowManager.GetType().GetEvent("SendComment");
eventInfo.AddEventHandler(rfqWindowManager,
Delegate.CreateDelegate(eventInfo.EventHandlerType, this, "HandleRfqSendComment"));
//<<<<<<<<<<ABOVE LINE IS WHERE I AM GOING WRONG>>>>>>>>>>>>>>
}
private void HandleRfqSendComment(object sender, object args)
{
Type sendCommentArgsType = args.GetType();
PropertyInfo cancelProperty = sendCommentArgsType.GetProperty("Cancel");
cancelProperty.SetValue(args, true, null);
}
}