3

全部。也许我没有足够的谷歌搜索,但我找不到关于这个问题的任何例子。

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

4

2 回答 2

7

是的,您可以这样做,但不,它不是 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 中)。

于 2009-11-01T08:22:50.347 回答
6

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

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

于 2009-11-01T07:49:01.943 回答