C#属性来修改方法

C#属性来修改方法,c#,.net,reflection,attributes,cross-cutting-concerns,C#,.net,Reflection,Attributes,Cross Cutting Concerns,全部。也许我在谷歌搜索得不够,但我找不到关于这个问题的任何例子 在C#中是否可以创建一个自定义属性,该属性应用于一个类,修改它的所有方法?例如,添加Console.WriteLine(“你好,我是修改过的方法”)作为第一行(或者如果它是在运行时完成的,则是IL等价物)?否。您正在寻找的是面向方面的编程() 使用AOP,您可以指定一个切入点,一个您希望在代码中编织的位置,以及您希望在该点执行的代码。跟踪是AOP的标准示例。您可以指定一组方法和weaver/编译器,以便在该方法的开头或结尾添加日志/

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


在C#中是否可以创建一个自定义属性,该属性应用于一个类,修改它的所有方法?例如,添加
Console.WriteLine(“你好,我是修改过的方法”)作为第一行(或者如果它是在运行时完成的,则是IL等价物)?

否。您正在寻找的是面向方面的编程()


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

是的,您可以这样做,但不是,它不是内置于C。正如Eric所说,这种技术被称为面向方面编程

我在工作中用过,效果很好。与其他AOP技术不同,它在编译时工作,并使用IL编织

例如,以下属性将执行您想要的操作:

[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
作为属性应用于类,它将应用于类中的每个方法。您可以通过修改
multicastatributeUsage
属性的
TargetmemberAttributes
属性来控制应用方面的方式。在这个例子中,我想限制它只适用于公共的、非抽象的方法


你还可以做更多的事情,看一看(通常是AOP)。

在链接的wikipedia页面(脚注6)的末尾有更多的.NET-AOP扩展。例如,这就是我需要的。我的理解是,这种技术在运行时不会造成性能损失?满足性能问题的最佳方法是测量性能,看看它是否足够好。然而,一件简单的事情就是在reflector()中打开生成的程序集并查看生成的代码。看看你怎么想。在工作中使用这种技术,我们没有发现任何有问题的性能问题。