传递lambda函数而不是值.C#是热切评估的,所以为了推迟执行,以便每个站点重新计算你需要在函数中包装参数所提供的参数.
int blah = 1;
void Foo(Func<int> somethingToDo) {
int result1 = somethingToDo(); // result1 = 100
blah = 5;
int result2 = somethingToDo(); // result = 500
}
Foo(() => blah * 100);
Run Code Online (Sandbox Code Playgroud)
如果您使用的是.NET 4.0,则可以使用Lazy类来获得类似(但不完全相同)的效果. Lazy
记住结果,以便重复访问不必重新评估函数.
您可以使用Reflection来做到这一点:
使用系统; 使用系统反射; 类 CallMethodByName { 字符串名称; CallMethodByName(字符串名称) { this.name = 名称; } public void DisplayName() // 按名称调用的方法 { Console.WriteLine(名称); // 证明我们调用了它 } 静态无效Main() { // 实例化该类 CallMethodByName cmbn = new CallMethodByName("CSO"); // 通过名称获取所需的方法:DisplayName 方法信息 方法信息 = typeof(CallMethodByName).GetMethod("DisplayName"); // 使用实例调用不带参数的方法 methodInfo.Invoke(cmbn, null); } }