все. Может быть, я недостаточно разбирался в Google, но я не могу найти ни одного примера по этому вопросу.
В С# возможно создать пользовательский атрибут, который применяется к классу, модифицирует все его методы? Например, добавляет Console.WriteLine("Hello, i'm modified method");
в качестве первой строки (или это эквивалент IL, если он выполняется во время выполнения)?
Да, вы можете это сделать, но нет, он не встроен в С#. Как говорит Эрик, этот метод известен как ориентированное на аспект программирование.
Я использовал PostSharp на работе, и это очень эффективно. Он работает во время компиляции и использует IL-weaving, в отличие от других методов АОП.
Например, следующий атрибут будет делать то, что вы хотите:
[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
. В этом примере я хочу ограничить его применимость только к общедоступным, не абстрактным методам.
Там гораздо больше вы можете посмотреть (в AOP вообще).
Нет. Вы ищете аспектно-ориентированное программирование (AOP).
В AOP вы указываете pointcut, место, где вы хотите переплетаться в коде, и код, который вы хотите выполнить в этой точке. Трассировка является стандартным примером для АОП. Вы указываете набор методов, а компилятор/weaver/компилятор добавляет вам вызов журнала/трассировки в начале или в конце этих методов.