public class TheAnswer
{
public event EventHandler MyEvent = delegate { };
public void RemoveFromMyEvent(string methodName)
{
foreach (var handler in MyEvent.GetInvocationList())
{
if (handler.Method.Name == methodName)
{
MyEvent -= (EventHandler)handler;
}
}
}
}
РЕДАКТИРОВАТЬ 2: Извиняюсь за мое недопонимание - я вижу, что вы совершенно ясно не имели доступа к источникам событий в исходном сообщении.
Самый простой способ решения этой проблемы - реализовать общий словарь привязок объекта к документу. Когда объект входит в документ, проверьте словарь на наличие привязки к другому документу; если есть, удалите обработчики, которые ссылаются на старый документ, прежде чем добавлять их для нового. В любом случае, обновите словарь с новой привязкой.
Я думаю, что в большинстве случаев влияние на производительность и память было бы незначительным: если вы не имеете дело со многими десятками тысяч небольших объектов и часто обмениваетесь ими между документами, накладные расходы памяти каждой пары ключ / значение и снижение производительности для каждая операция поиска должна быть довольно маленькой.
В качестве альтернативы: если вы можете обнаружить (в обработчиках событий документа), что отправитель события больше не имеет отношения к документу, вы можете отсоединить события там.
Это похоже на те идеи, которые вы, возможно, уже отвергли, но, возможно, нет!