gpt4 book ai didi

c# - 从另外两个创建动态表达式 lambda(链接表达式)

转载 作者:太空狗 更新时间:2023-10-29 18:23:12 24 4
gpt4 key购买 nike

给定一个接受 Identification 对象并返回属性的 lambda:

Expression<Func<Identification, object>> fx = _ => _.Id;

还有一个将对象转换为标识实例的转换 lambda:

ParameterExpression p = Expression.Parameter(typeof(object), "o");
Expression @new = Expression.Lambda(Expression.Convert(p, typeof(Identification)), p);

我如何构建一个执行 @new 的新 lambda (取出标识实例)并将结果传递给 fx .我需要 @new的结果绑定(bind)到 fx 的第一个参数不知何故,我找不到例子。

我需要结果是 Expression , 它应该是 Expression<Func<object, object>> 类型它应该将入站参数转换为 Identification然后得到 Id属性(property)。

最佳答案

首先,请注意,如果您适本地键入 @new,这会更容易,即:

LambdaExpression @new = ...

因为这提供了对 @new.Body@new.Parameters 的轻松访问;完成了,Expression.Invoke 在这里很有用:

var combinedParam = Expression.Parameter(typeof(object), "o");
var combined = Expression.Lambda<Func<object, object>>(
Expression.Invoke(fx,
Expression.Invoke(@new, combinedParam)), combinedParam);

虽然为了更简洁的表达式,您也可以使用 ExpressionVisitor 来完全替换内部表达式:

var injected = new SwapVisitor(fx.Parameters[0], @new.Body).Visit(fx.Body);
var combined = Expression.Lambda<Func<object, object>>(injected,@new.Parameters);

与:

class SwapVisitor : ExpressionVisitor {
private readonly Expression from, to;
public SwapVisitor(Expression from, Expression to) {
this.from = from;
this.to = to;
}
public override Expression Visit(Expression node) {
return node == from ? to : base.Visit(node);
}
}

这是做什么的:

  • 检查 fx.Body 树,用 @new.Body 替换 _(参数)的所有实例(注意这将包含对 o 参数(又名 p)
  • 的引用
  • 然后我们从替换的表达式构建一个新的 lambda,重新使用来自 @new 的相同参数,这确保我们注入(inject)的值将被正确绑定(bind)

关于c# - 从另外两个创建动态表达式 lambda(链接表达式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7873448/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com