【发布时间】:2019-06-09 04:31:56
【问题描述】:
现在我要把表达式树编译成一个委托来动态生成代码,但是我有一个问题。我必须调用表达式树中的一个方法,这正是尚未动态编译的表达式树委托。我该怎么办?
我想从表达式树生成如下代码:
int i = 0;
Action ac = null;
ac = () =>
{
//if (i-- > 0) condition
ac();
};
以下代码不起作用,会提示ac is null
static Action ac = Build();
static Action Build()
{
return Expression.Lambda<Action>(
Expression.Call(
Expression.Constant(ac), //throw ac is null
typeof(Action).GetType().GetMethod("Invoke")
)
).Compile();
}
【问题讨论】:
-
它不起作用吗?
-
如果你想要一个递归委托,声明一个。不要费心尝试制作无名递归委托。
-
@J. van Langen 我已经编辑了问题
-
@user2864740 我已经编辑了问题
-
我在这里找到了:Recursive Methods in Expression Trees。您必须创建两个 lambda 表达式。第一个生成第二个 lambda 并将其存储在一个变量中,然后将该变量作为参数传递给第二个 lambda。
标签: c# recursion expression-trees