Как манипулировать во время выполнения списком вызовов делегата? - PullRequest
5 голосов
/ 03 августа 2010

Я хочу знать, как мне удалить отдельные делегаты из списка вызовов родительского делегата.

<DelegateName>.RemoveAll();

Теперь я могу просто удалить все, и это сработает, просто чтобы привести идею в движение и посмотреть, работает ли она, как это должно быть, но тогда все удаленные делегаты должны будут снова добавить в RunTime !!!

так: ...

foreach(Delegate d in <DelegateName>.getInvocationList)
{ // do something with 'D'?? }

Теперь, когда у меня есть доступ к 'D', я могу поместить его в .Remove (), но это требует двух аргументов ??? Могу ли я получить помощь с этим, пожалуйста?

Наконец, после удаления делегата, каков наилучший способ его повторного добавления? Поэтому я предполагаю, что Reflection может сыграть в этом роль, но вам, ребята.

ОБНОВЛЕНИЕ:

По сути, существует глобальный делегат, в котором много событий, живущих в разных классах winforms, которые являются его экземплярами. Все эти события имеют обработчик, который обрабатывает событие при его запуске. Весь делегат сверху управляет всеми обработчиками, которые соответствуют его сигнатуре. Я хочу возиться с этим делегатом наверху, я хочу удалить все обработчики, а затем повторно добавить их во время выполнения. Таким образом, делегат наверху является многоадресным делегатом, а его список вызовов - это список отдельных делегатов, которые в свою очередь указывают на один из четырех добавленных мной обработчиков. Я надеюсь, что это имеет смысл, это общее представление о том, что я делаю.

Ответы [ 2 ]

7 голосов
/ 03 августа 2010

Вы не можете - делегаты неизменны.Вы можете создать новый делегат, который эквивалентен старому без определенных действий, но вы не можете изменить существующий на месте.

3 голосов
/ 03 августа 2010

Список вызовов является внутренним компонентом делегата, вы не можете изменить его нормально. Вы можете сделать это с помощью очень грязного размышления, но я не думаю, что это правильная идея для производственного кода. Но есть и другой способ решить это правильно. Вы можете определить event без автоматического нижележащего делегата и управлять списком вызовов самостоятельно. Для этого вам нужно определить событие с явными ключевыми словами add и remove, см. здесь . Вам придется переопределить некоторые вещи для этого, но это даст вам полный контроль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...