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