Я думаю, что вам не хватает третьего компонента. Большинство реализаций AOP (например, Aspect # ) полагаются на прокси или перехватчик для фактического выполнения кода. В вашем сценарии вам не хватает какого-либо компонента, необходимого для того, чтобы: 1) знать, что атрибут существует в методе, и 2) запустить механизм (или стать им), необходимый для выполнения кода внутри атрибута.
К счастью, уже есть много (довольно) простых решений, доступных в открытом коде. Самым простым вариантом, о котором я могу подумать, было бы использование ткача времени компиляции, например PostSharp . Возьмите копию этого, и в примерах вы найдете несколько примеров того, что именно вы пытаетесь сделать (вас может заинтересовать OnMethodInvocationAspect).
Конечным результатом является то, что ваш код выглядит точно так же, как и в приведенном вами примере, но он также выполняет код, который вы хотите.