Вам нужно быть более конкретным. Вам не нужно проверять, что ВСЕ делегаты событий были отписаны, потому что в общем случае подписчик живет короче, чем издатель. А утечка памяти происходит только тогда, когда ваш подписчик кажется более долгоживущим, чем издатель, поэтому существует ссылка, которая не позволяет GC собирать объект издателя.
Теперь нам нужно убедиться, что если вы подписываетесь на событие относительно недолговечного объекта, вы в конце концов отмените подписку.
Эвристика, которую я могу придумать в этом случае: проанализировать все объекты локальных переменных (которые ограничены текущим блоком кода {}) и все объекты, которые вы явно удалите. Для каждого события в этих объектах подсчитайте, сколько раз вы подписались на них и сколько раз вы отменили подписку. Если первое число больше, выведите предупреждение.
Конечно, это не охватывает все случаи, но я думаю, что никакой статический подход не может охватить все случаи в этой проблеме, вам нужен какой-то метод, который достаточно хорош.
Я не буду упоминать о преимуществах динамического анализа и обзоров кода здесь, поскольку это отдельная тема, не связанная с вопросом.