Да, вы можете сделать это, но нет, это не встроено в C #. Как говорит Эрик, этот метод известен как Аспектно-ориентированное программирование.
Я использовал PostSharp на работе, и это очень эффективно. Он работает во время компиляции и использует IL-ткачество, в отличие от других методов АОП.
Например, следующий атрибут будет делать то, что вы хотите:
[Serializable]
[MulticastAttributeUsage(MulticastTargets.Method | MulticastTargets.Class,
AllowMultiple = true,
TargetMemberAttributes = MulticastAttributes.Public |
MulticastAttributes.NonAbstract |
MulticastAttributes.Managed)]
class MyAspect : OnMethodInvocationAspect
{
public override void OnInvocation(MethodInvocationEventArgs eventArgs)
{
Console.WriteLine("Hello, i'm modified method");
base.OnInvocation(eventArgs);
}
}
Вы просто применяете MyAspect
в качестве атрибута вашего класса, и он будет применяться ко всем методам в нем. Вы можете контролировать, как применяется аспект, изменяя свойство TargetmemberAttributes
свойства MulticastAttributeUsage
. В этом примере я хочу ограничить его применение только к публичным неабстрактным методам.
Вы можете сделать гораздо больше, посмотрите (в целом на АОП).