【发布时间】:2011-06-13 10:47:22
【问题描述】:
是否可以查看在表达式树上调用 Compile() 时生成的 IL 代码?考虑这个非常简单的例子:
class Program
{
public int Value { get; set; }
static void Main(string[] args)
{
var param = Expression.Parameter(typeof(Program));
var con = Expression.Constant(5);
var prop = Expression.Property(param, typeof(Program).GetProperty("Value"));
var assign = Expression.Assign(prop, con);
Action<Program> lambda = Expression.Lambda<Action<Program>>(assign, param).Compile();
Program p = new Program();
lambda(p);
//p.Value = 5;
}
}
现在,表达式树执行Main 的最后一行所说的。编译应用程序,然后在 Reflector 中打开它。您可以看到执行分配的p.Value = 5; 的 IL 代码。但是表达式树是在运行时创建和编译的。是否可以从编译中查看生成的 IL 代码?
【问题讨论】:
-
您是否只希望 等效 IL 用于您正在正在执行的操作(即设置属性)?或者您对
Expression输出有什么特别感兴趣的内容? -
没有具体内容。我喜欢不时查看 IL 代码。但是使用表达式,您可以创建一个在已编译程序集中不获取任何 IL 的方法。用于创建该表达式树的 IL 存在,但不是表达式树本身的编译结果。那有意义吗?这只是一种好奇心,并没有我能看到的任何实际用途。
-
您尝试过出色的 LinqPad 工具吗? linqpad.net 有了它,您可以将生成的代码显示为 MSIL 并快速试验几乎任何东西...
标签: c# expression-trees il .net-reflector