C# 封装方法调用

C# 封装方法调用,c#,.net,C#,.net,我有一些机制来测量方法执行时间。简单地说,在方法开始时我节省时间,在方法结束时我节省时间并比较这两个值 但每次我想使用它时,我都需要修改方法体 我正在寻找一种更干净的方式——比如让一个对象负责测量时间,它可以封装方法调用——比如一些包装器,调用该方法,传递返回值,并在该过程中测量时间 另外,我知道这可能有点科幻,但有没有办法包装或附加到所有方法(甚至方法的子集)?例如,它也可以用于日志记录,比如“我正在使用参数YYY和返回值vas ZZZ调用实例XXX的方法” 我知道在JavaEE中类似的事情是

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

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

我正在寻找一种更干净的方式——比如让一个对象负责测量时间,它可以封装方法调用——比如一些包装器,调用该方法,传递返回值,并在该过程中测量时间

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

我知道在JavaEE中类似的事情是可能的。(如果我没记错的话,我想它被称为拦截器,它们可以附加到某些或所有方法并添加功能,但我不知道这在.net中是否可行)


谢谢。

我正在使用带有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
            }:

这里有一个很好的方法是使用面向方面的编程,如PostSharp…下面是使用它进行时间测量的示例:

优点是,您只需向方法添加一个属性,而不必改变/污染方法体

干杯,
Christian

我用了这个简单的方法:

TimeSpan TimeAction(Action action)
{
    var sw = new Stopwatch();
    sw.Start();
    action.Invoke();
    sw.Stop();
    return sw.Elapsed;
}
这就是如何使用它

var time = TimeAction(() =>
{
    //your code here    
});

PostSharp Aspects可能会对您有所帮助,请查看其功能页面上的示例:


我钦佩您的创造力,但解决方案是滥用定义良好的模式:它易于阅读,易于维护,并且不会使重要的代码变得杂乱无章。这对我很重要。