如何在运行时(C#)中查看lambda表达式的源代码?

时间:2017-06-27 09:08:06

标签: c# lambda

全部,我试图弄清楚lambda表达式在运行时的编译时间内是如何工作的。假设你有如下所示的源代码。 enter image description here

目前,我试图快速观察变量。但不幸的是。无法查看Fun的源代码。是否有其他方法可以查看Func<int> ageCalculator运行的实际代码?感谢。

更新

在反射器类工具中没有幸运的东西。请在dotPeek中查看。感谢。

enter image description here

更新1

启用该选项后,树中会显示更多项目(已编译生成的类项目)。但是双击这些项目。只显示MyTempClass源代码没有新内容。它假设显示什么?感谢。

enter image description here

4 个答案:

答案 0 :(得分:1)

您无法看到C#源代码,因为没有。编译器会自动生成一个类,因此您唯一能看到的是中间代码(IL)。 IL代码可能会被其他工具(如Reflector)显示为C#(我没有在Visual Studio中集成这样的工具,因此我无法尝试)。

当您启用&#34;显示编译器生成的代码&#34;时,您可以在dotPeek中看到它:

dotPeek Setting

接下来,右键单击并选择&#34; Decompiled sources&#34;显示生成的代码:

dotPeek Showing the generated class

答案 1 :(得分:1)

关键问题是通过返回Func返回已编译的lambda,您想要返回Expression<Func<int>>。然后,您可以致电ToString()查看其代表,并Compile().Invoke()运行

Expression<Func<int>> AgeCalculator() {
  int myAge = 30;
  return () => myAge;
}

public void Closure() {
  var ageCalculator = AgeCalculator();
  Console.WriteLine(ageCalculator.ToString());
  Console.WriteLine(ageCalculator.Compile().Invoke());
}

答案 2 :(得分:0)

我可以看到一些未完全按照预期使用的东西。请考虑以下代码:

class Program
{
    static void Main(string[] args)
    {
        // You do not call the method to assign it to the variable, 
        // you point to the method (without parentheses)
        Func<int> answer = GetTheAnswerToEverything;

        // Here you actually call the method
        Console.WriteLine(answer());
        Console.ReadLine();
    }

    // This is the method that you call when you write **add()**
    private static int GetTheAnswerToEverything() => 42;
}

在此示例中,您实际调用answer()时调用GetTheAnswerToEverything方法。

有关详细信息,请参阅Func Delegate

  

封装没有参数的方法,并返回由TResult参数指定的类型的值。

答案 3 :(得分:0)

我不确定这是不是你想要的,但是LinqPad有一些观点TreeIL也许这就是你要找的......

enter image description here enter image description here