Tad*_*ghe 11 .net c# refactoring .net-3.5
我有这样的代码:
Logger logger = new Logger();
System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();
logger.LogInformation("Calling SomeObject.SomeMethod at " + DateTime.Now.ToString());
stopWatch.Start();
// This is the method I'm interested in.
SomeResponse response = someObject.SomeMethod(someParam);
stopWatch.Stop();
logger.LogInformation("SomeObject.SomeMethod returned at " + DateTime.Now.ToString());
logger.LogInformation("SomeObject.SomeMethod took " + stopWatch.ElapsedMilliseconds + " milliseconds.");
Run Code Online (Sandbox Code Playgroud)
我需要围绕更多对象及其方法包装类似的代码来进行一些性能分析.我不允许使用第三方插件或软件等.
我真的不想在所有这些方法调用这个所有这些日志代码中编写相同的代码.您如何重构这一点以消除我的一些编码工作?
如果我不是很清楚,请在评论中提问,我会尽力澄清.
谢谢你的帮助!!
Amy*_*y B 19
您可以重构代码以接受方法指针实例(也称为System.Action).
public void CallWithLogTiming (Action theAction)
{
Logger logger = new Logger();
System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();
logger.LogInformation("Calling SomeObject.SomeMethod at " + DateTime.Now.ToString());
stopWatch.Start();
// This is the method I'm interested in.
theAction();
stopWatch.Stop();
logger.LogInformation("SomeObject.SomeMethod returned at " + DateTime.Now.ToString());
logger.LogInformation("SomeObject.SomeMethod took " + stopWatch.ElapsedMilliseconds + " milliseconds.");
}
Run Code Online (Sandbox Code Playgroud)
然后你可以通过创建一个lambda表达式来调用它.由于myResponse是一个捕获变量,因此在运行此Action时将填充该变量,并且myResponse将在稍后的范围内使用.
SomeResponse myResponse = null;
CallWithLogTiming( () => myResponse = someObject.SomeMethod(someParam) );
Run Code Online (Sandbox Code Playgroud)
为简单起见,你可以使用泛型,就像这样(在我的头顶):
public T MyLogMethod<T,S>(Func<S, T> someFunction, S someParameter) {}
Run Code Online (Sandbox Code Playgroud)
Func(S,T)其中S是方法的参数类型,T是返回类型.
我想我实现了一个可以像这样使用的计时器类:
void test()
{
foo();
//timer for the following statements
using (new MyTimer("Some method"))
{
bar();
}
baz();
}
Run Code Online (Sandbox Code Playgroud)
MyTimer类实现如下: