全部。也许我没有足够的谷歌搜索,但我找不到关于这个问题的任何例子。
可以在 C# 中创建一个自定义属性,该属性应用于一个类,修改其所有方法?例如,添加Console.WriteLine("Hello, i'm modified method");
为第一行(或者如果它在运行时完成,则相当于 IL)?
全部。也许我没有足够的谷歌搜索,但我找不到关于这个问题的任何例子。
可以在 C# 中创建一个自定义属性,该属性应用于一个类,修改其所有方法?例如,添加Console.WriteLine("Hello, i'm modified method");
为第一行(或者如果它在运行时完成,则相当于 IL)?
是的,您可以这样做,但不,它不是 C# 内置的。正如 Eric 所说,这种技术被称为面向方面的编程。
我在工作中使用过PostSharp,它非常有效。它在编译时工作,并使用 IL 编织,而不是其他 AOP 技术。
例如,以下属性将执行您想要的操作:
[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,您可以指定一个切入点,一个您想要编织代码的位置,以及您想要在该点执行的代码。跟踪是 AOP 的标准示例。您指定一组方法和编织器/编译器以在该方法的开头或结尾添加您的日志/跟踪调用。