Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过属性包装方法?_C#_Attributes - Fatal编程技术网

C# 如何通过属性包装方法?

C# 如何通过属性包装方法?,c#,attributes,C#,Attributes,我想知道是否可以只通过添加一个属性来包装一个方法 示例:我想记录一个方法的执行时间 [LogTimings] public void work() { .. } 这是一种将方法包装到另一个方法()中的方法。AOP在.NET中是可能的。这里有一个关于它的例子。下面是一个针对.NET的AOP框架。请看一看.NET的AOP框架 在日志记录和计时方面,还有一个名为PostSharp的框架,它与PostSharp集成,应该可以更容易地收集和使用结果。我一直想试一下……如果你使用的话,你可以不用使用不

我想知道是否可以只通过添加一个属性来包装一个方法

示例:我想记录一个方法的执行时间

[LogTimings]
public void work()
{
  ..
}

这是一种将方法包装到另一个方法()中的方法。

AOP在.NET中是可能的。这里有一个关于它的例子。下面是一个针对.NET的AOP框架。

请看一看.NET的AOP框架


在日志记录和计时方面,还有一个名为PostSharp的框架,它与PostSharp集成,应该可以更容易地收集和使用结果。我一直想试一下……

如果你使用的话,你可以不用使用不同的编译器就可以做到这一点。

我在.Net上写了一些关于AOP的东西:

仅使用标准的.NET framework库,您必须通过从
System.Runtime.Remoting.proxy.RealProxy
派生来创建wrap功能

然后可以将此功能应用于类,但此类必须从
System.MarshallByRefObject
派生


这是一个相当大的限制,这就是为什么你可能想看看像PostSharp这样的第三方组件。

虽然这可以从理论上回答这个问题,但在这里包括答案的基本部分,并提供链接供参考。我想知道像这样的框架是否都是基于反射的。此外,这里的PostSharp.org链接已更改为@matrixuly:修复了链接,但不,你不能仅仅通过反射来完成所有这些-你基本上需要IL重写。这就是我收集的。我不喜欢第三方(甚至我自己的)库在发出的代码中捣乱。听起来像是PostSharp扫描了IL。我想知道这个简单版本是否可以加载一个程序集并使用反射来发出“AOP化”版本的dll。(这样就不会扫描IL?@Matrixuly:它仍然需要通过IL来发射AOP化的IL。。。老实说,我不太确定反对意见是什么……难道不可能加载程序集并修改现有方法的表达式树,然后输出一个新的dll吗?那样的话,你不是在明确地查看IL,而是让反射完成工作。。。正确的?