封装方法调用

3

我有一些测量方法执行时间的机制。简单地说,在方法开始时,我保存时间,在结束时保存时间,并比较这两个值。

但每次使用它时,我都需要修改方法体。

我正在寻找更清晰的方法 - 比如一个负责测量时间的对象,它可以封装方法调用 - 就像某个包装器,调用那个方法,传递返回的值,并在该过程中测量时间。

此外,我知道这可能有点科幻,但是否有办法包装或附加到所有方法(甚至是方法子集)?例如,它还可以用于记录日志 - 如“我正在调用实例XXX的方法,参数为YYY,返回值为ZZZ”?

我知道在Java EE中有类似的东西。 (如果我记得正确的话,它被称为拦截器,它们可以附加到某些或所有方法并添加功能,但我不知道在.net中是否可能)

谢谢。

4个回答

5
我使用了这个简单的方法:
TimeSpan TimeAction(Action action)
{
    var sw = new Stopwatch();
    sw.Start();
    action.Invoke();
    sw.Stop();
    return sw.Elapsed;
}

这是如何使用它的方法。
var time = TimeAction(() =>
{
    //your code here    
});

4
我正在使用一个带有IDisposable接口的计时器包装器来测量方法/代码块的执行时间。
  public class AutoStopwatch : IDisposable
  {
    private Stopwatch autoStopwatch;
    private String method;
    public AutoStopwatch(String Method)
    {
      this.method = Method;
      autoStopwatch = Stopwatch.StartNew();
    }
    public void Dispose()
    {
      autoStopwatch.Stop();
      Debug.Print(string.Format("Elapsed for {0} : {1}", method, autoStopwatch.Elapsed.ToString()));
    }
  }
}

// 例子

 using (AutoStopwatch Awatch = new AutoStopwatch("Read Keys from REDIS"))
            {
              //  Your Stuff
            }:

我钦佩你的创造力,但该解决方案滥用了一个明确定义的模式:http://en.wikipedia.org/wiki/Dispose_pattern - gimlichael
1
它易于阅读,易于维护,不会使代码混乱。这对我来说很重要。 - Alex

0

0

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