如何在C#中实现名称调用?

Dr *_* TJ 5 c# compiler-theory callbyname

谁能告诉我如何在C#中实现Call By Name

Ron*_*lic 9

传递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记住结果,以便重复访问不必重新评估函数.

  • 对于那些想知道的人,使用`Lazy <T>`会导致*需要调用*. (3认同)
  • @Steven:的确,严格来说lambda不是委托,而是可以隐式转换为匹配的委托类型. (2认同)

fre*_*oma 2

您可以使用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);
   }
}

  • 这不是直呼其名。http://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_name (5认同)
  • OP很可能指的是http://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_name,这与根据名称动态调用方法不同。 (5认同)