所有。也许我还没有用Google搜索,但我找不到这个问题的任何例子。
在C#中可以创建一个自定义属性,该属性应用于类修改其所有方法吗?例如,将Console.WriteLine("Hello, i'm modified method");
添加为第一行(如果在运行时完成,则为IL等效值)?
答案 0 :(得分:5)
没有。您正在寻找的是面向方面的编程(AOP)。
使用AOP,您可以指定一个切入点,一个您想在代码中编织的位置,以及您希望在该点执行的代码。跟踪是AOP的标准示例。您指定一组方法和weaver /编译器,以在该方法的开头或结尾添加日志/跟踪调用。
答案 1 :(得分:5)
是的,你可以这样做,但不,它不是内置于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)。