【问题标题】:How to extend MemberExpression using another expression [duplicate]如何使用另一个表达式扩展 MemberExpression [重复]
【发布时间】:2021-10-16 02:19:44
【问题描述】:

给定

Expression<Func<SubType, PropertyType>> selector = subType => subtype.[...].Property

我想扩展另一个提供 SubType 的 MemberExpression,如下所示:

var parameter = Expression.Parameter(typeof(ParentType), "parameter");
var subTypeProperty = Expression.Property(parameter, nameof(ParentType.SubType));

要生成另一个从 ParentType 开始的 MemberExpression,遍历与第一个选择器表达式相同的路径并提供如下 MemberExpression:

parentType.SubType.[...].Property

我该怎么做?

【问题讨论】:

    标签: c# expression


    【解决方案1】:

    其实this链接为我的问题提供了很好的解释和解决方案

    使用 ExpressionVisitor,您可以遍历第一个选择器,查找参数表达式并将所有参数表达式替换为“subTypeProperty”MemberExpession

    使用:

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

    然后:

    var newSelector = new ReplaceVisitor(selector.Parameters.First(), subTypeProperty)
                .Visit(selector.Body);
    

    【讨论】:

      猜你喜欢
      • 2017-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-26
      相关资源
      最近更新 更多