我想知道是否有可能只通过添加一个属性来包装一个方法。如何通过属性包装一个方法?
例如:我想记录一个方法需要的执行时间。
[LogTimings]
public void work()
{
..
}
这是一种包装方法到另一个(see this python implementation)。
我想知道是否有可能只通过添加一个属性来包装一个方法。如何通过属性包装一个方法?
例如:我想记录一个方法需要的执行时间。
[LogTimings]
public void work()
{
..
}
这是一种包装方法到另一个(see this python implementation)。
AOP在.NET中是可行的。这是关于它的article。这里是一个用于.NET的list of AOP frameworks。
看看PostSharp,.NET的AOP框架。
在日志记录和时间方面,还有一个名为Gibraltar的框架,它与PostSharp集成在一起,它可以更容易地收集和使用结果。我一直在努力尝试它......
我不知道这些框架是否都是基于反思。另外,这里的PostSharp.org链接已经改为https://www.postsharp.net/ – matrixugly
@matrixugly:修正了链接,但不是,你不能用反射做所有这些 - 你需要重写IL,基本上。 –
这就是我收集的。我不喜欢第三方(甚至是我自己的)在发布的代码中使用库的想法。听起来像PostSharp实际上扫描IL。我想知道这个简单版本是否可以加载程序集并使用反射来发出dll的“AOP -ized”版本。 (这样就没有IL的扫描了吗?) – matrixugly
如果您使用PostSharp,则无需使用其他编译器即可完成此操作。
我写了一些东西,关于AOP .Net的位置: Help and Information about Aspect Oriented Programming
仅使用标准的.NET框架库,你就必须从System.Runtime.Remoting.Proxies.RealProxy
派生来创建换行功能。
此功能然后可以适用于您的班级,但此类必须从System.MarshalByRefObject
派生。
这是相当多的限制,这就是为什么你可能想看看PostSharp等第三方组件。
虽然这可能在理论上回答这个问题,但[这将是更可取的](http://meta.stackoverflow.com/q/8259)在这里包括答案的基本部分,并提供供参考的链接。 –