全部,我试图弄清楚lambda表达式在运行时的编译时间内是如何工作的。假设你有如下所示的源代码。
目前,我试图快速观察变量。但不幸的是。无法查看Fun
的源代码。是否有其他方法可以查看Func<int> ageCalculator
运行的实际代码?感谢。
更新
在反射器类工具中没有幸运的东西。请在dotPeek
中查看。感谢。
更新1
启用该选项后,树中会显示更多项目(已编译生成的类项目)。但是双击这些项目。只显示MyTempClass
源代码没有新内容。它假设显示什么?感谢。
答案 0 :(得分:1)
您无法看到C#源代码,因为没有。编译器会自动生成一个类,因此您唯一能看到的是中间代码(IL)。 IL代码可能会被其他工具(如Reflector)显示为C#(我没有在Visual Studio中集成这样的工具,因此我无法尝试)。
当您启用&#34;显示编译器生成的代码&#34;时,您可以在dotPeek中看到它:
接下来,右键单击并选择&#34; Decompiled sources&#34;显示生成的代码:
答案 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
有一些观点Tree
,IL
也许这就是你要找的......