C#属性修改方法

时间:2009-11-01 07:45:36

标签: c# reflection attributes

所有。也许我还没有用Google搜索,但我找不到这个问题的任何例子。

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

2 个答案:

答案 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)。