(我是英语新手)
我使用Expression.Lambda动态创建lambda。
我想要捕获变量,但我不知道如何使用Expression进行捕获。
public class Demo
{
/** skip */
private Context _context;
public void Route(Person person)
{
Packet packet = Packet.GetPacket();
Func <Context, object> lambda =
(context) => this.OtherMethod(context, person, packet); // THIS
}
/** skip */
}
我想使用Expression @ Lambda创建lambda(看评论“THIS”)。 有可能吗?
这是我正在尝试制作的代码。(不工作)
var main = new DemoApplication();
var mainType = main.GetType();
var methodInfo = mainType.GetMethod("OtherMethod");
var targetExpression = Expression.Parameter(mainType, "this");
var parameterExpressions = methodInfo.GetParameters().Select(info => Expression.Parameter(info.ParameterType, info.ParameterType.Name)).ToArray();
var body = Expression.Call(targetExpression, methodInfo, parameterExpressions); // {this.OtherMethod(Context, Person, Packet)}
var lambdaParameters = new List<ParameterExpression> { parameterExpressions[0] };
var lambda = Expression.Lambda(body, lambdaParameters); // {Context => this.OtherMethod(Context, Person, Packet)}
var lambdaDelegate = lambda.Compile(); // ERROR