C#属性修改方法

ALO*_*LOR 2 c# reflection attributes

所有.也许我没有用Google搜索,但我在这个问题上找不到任何例子.

在C#中可以创建一个自定义属性,该属性应用于类修改其所有方法吗?例如,添加Console.WriteLine("Hello, i'm modified method");为第一行(如果在运行时完成,则为IL等价物)?

Eri*_*fer 5

不.您正在寻找的是面向方面编程(AOP).

使用AOP,您可以指定切入点,要在代码中编织的位置以及要在该点执行的代码.跟踪是AOP的标准示例.您指定一组方法和weaver /编译器,以在该方法的开头或结尾添加日志/跟踪调用.


Nad*_*zie 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

您只需将其MyAspect作为属性应用于您的类,它将应用于其中的每个方法.您可以通过修改TargetmemberAttributes属性的MulticastAttributeUsage属性来控制方面的应用方式.在这个例子中,我想将它限制为仅适用于公共的非抽象方法.

你可以做更多的事情看看(一般来说是AOP).