Maybe resolve all objects using IoC container?
You could configure interceptors for your types and in them check if called method is decorated with that attribute. You could cache that information so that you don't have to use reflection on every method call.
So when you do this:
var something = IoC.Resolve();
something
is not object you have implemented but proxy. In that proxy you can do whatever you want before and after the method call.