C#使用属性对函数计时

C#使用属性对函数计时,c#,.net,function,time,attributes,C#,.net,Function,Time,Attributes,我想使用属性对函数计时。我想这样做: [TimeIt] public MyFunc() { //do something ... return; } 在执行此函数时,如果函数花费的时间高于阈值,则属性应使用log4net记录时间 这与MVC ActionFilterAttribute的功能类似,只是我不想使用MVC。属性是(除了一些极少数的例外,例如运行时本身发现的[PrincipalPermission])元数据;所以不要让额外的代码神奇地被调用。例外情况是通过PostSharp这样的工具,

我想使用属性对函数计时。我想这样做:

[TimeIt]
public MyFunc()
{
//do something
...
return;
}
在执行此函数时,如果函数花费的时间高于阈值,则属性应使用log4net记录时间

这与MVC ActionFilterAttribute的功能类似,只是我不想使用MVC。

属性是(除了一些极少数的例外,例如运行时本身发现的
[PrincipalPermission]
)元数据;所以不要让额外的代码神奇地被调用。例外情况是通过PostSharp这样的工具,它在构建时定位这些属性并在额外代码中编织

在所有其他情况下,您必须自己通过反射检查该属性,并编写代码从属性中调用额外的方法。这就是ASP.NETMVC所做的;它标识预期的属性族,并调用基类方法以触发过滤器

如果您正在编写一个插件框架,这可能是有意义的。如果是针对特定的方法插装,那么如果您不自己添加额外的代码,这是行不通的

更简单的方法是编写一个
IDisposable
类型,该类型在释放时写入经过的时间;然后你可以做:

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

也许有点滥用
使用
,但它应该会起作用。

PostSharp做的事情与此完全一样——不幸的是,它不是免费的:Castle.DynamicProxy会在这里起作用吗?不作为答案提交,因为这确实是一个问题。