我想尝试优化我的代码,并且我想测量一个函数所花费的时间。
我有一个名为Chrono的课程。所以我只需要在函数的开头添加chrono.start,最后添加chrono.stop。我的班级也会在列表中添加它测量的时间,然后得到平均时间,总时间......
有效。唯一的问题是当函数中间有exit sub或return时。不是真的有问题,我只是在函数的begginf处添加一个Try,并将我的chrono.stop放在finally部分中。我不确定它是否真的有效,但它确实有用。
所以这是我的问题:我希望有一个函数将函数名作为参数,在调用此函数时将自动启动和停止我的类。我听说过Reflection,但我不知道如何使用它。在互联网上搜索这个问题真的很难(因为这些词太常见了:“在功能结束时做点什么”)
要恢复,我的代码有效,没问题。它仅限于在短时间内将函数添加到函数中(有时忘记删除它)。
谢谢(我是法国人,希望我能理解)答案 0 :(得分:0)
这是您可以使用反射按名称调用方法的方法:
using System.Reflection;
public int InvokeMethod(string name)
{
int time1 = 1; //call your chrono.start here.
Type thisType = this.GetType();
MethodInfo theMethod = thisType.GetMethod(name);
theMethod.Invoke(this, new object[] { 1 });
int time2 = 10; //call your chrono.end here.
return time2 - time1;
}
然而,有一个问题。你怎么知道传递给函数的参数?在上面的代码中,我只传递整数1(new object[] { 1 }
)。因此,此代码无法自动执行,但如果您逐个针对每个函数手动运行它,那么您可以更改该行以传递正确的参数并使其工作而无需修改您的函数。
这是为了回答您的问题,如何使用反射按名称调用函数。但是,使用delegate
(或.Net v3.5及更高版本中的Fuc<T, tRsult>
)来调用它会容易得多。