使用属性来计时C#函数

21

我想使用一个属性来计时一个函数。我希望做类似这样的事情:

[TimeIt]
public MyFunc()
{
//do something
...
return;
}

执行此函数时,如果函数耗时超过阈值,则应使用log4net记录属性时间。

这类似于MVC ActionFilterAttribute的操作,但我不想使用MVC。


2
PostSharp做的事情与此完全相同 - 不幸的是它不是免费的:http://www.sharpcrafters.com/postsharp - Adam Houldsworth
Castle.DynamicProxy 在这里可行吗?我不提交答案,因为这确实是一个问题。 - user47589
1个回答

15

除了像[PrincipalPermission]这样的极少数情况(由运行时本身检测),属性仅仅是元数据,不会自动触发任何额外的代码。唯一的例外是通过像PostSharp这样的工具,在构建时定位这些属性并编织额外的代码。

在所有其他情况下,您都需要通过反射自己检查此属性,并编写代码来调用属性中的额外方法。这就是ASP.NET MVC所做的;它识别出预期的属性族并调用基类方法以使您的过滤器生效。

如果您正在编写插件框架,这可能是有意义的。如果是为了临时方法检测 - 您需要自己添加额外的代码才能使其正常工作。

更容易的方法可能是编写一个IDisposable类型,在其被处理时写入经过的时间; 然后您可以执行以下操作:

using(new MyTimer("My label")) {
    //... Your method
}

或许有点滥用 using,但它应该能够工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接