更改 Lambda 表达式以更深入一层

本文关键字:一层 Lambda 表达式 更改 | 更新日期: 2023-09-27 18:37:00

假设我有这样的方法:

public void MultiDropDown<T>(Expression<Func<T, DropDownModel<DropDownItem>>> expression)
{
   // Here i want to get more specific with the expression selector
   // Suppose it was passed like this: 
   //                                  MultiDropDown(x => x.MyDropDown);
   // I need to alter `expression` and go deeper:    x => x.MyDropDown.Title;
   // And then use the new expression for other stuff...
}

溶液

感谢斯维克!

public void MultiDropDown<T>(Expression<Func<T, DropDownModel<DropDownItem>>> expression)
{
        // 1. Build a new expression and select the final property
        Expression<Func<DropDownModel<DefaultDropDownItem>, object>> childExpression = x => x.Title;
        // 2. Extract property name
        var propName = (childExpression.Body as MemberExpression).Member.Name;
        // 3. Create a MemberExpression selection from parent's Body
        var expressionProperty = Expression.Property(expression.Body, propName);
        // 4. Finally create a Lambda Expression
        var refinedExpression = Expression.Lambda<Func<TModel, object>>(expressionProperty, expression.Parameters);
}

操作 1. 和 2. 只是为了避免"标题"字符串而依赖强类型模型。

更改 Lambda 表达式以更深入一层

您需要创建一个

表达式,该表达式获取查询的Body并访问其上的给定属性。然后,您需要重新构建 lambda 表达式。整个事情看起来像这样:

var titleExpression = Expression.Lambda<Func<T, string>>(
    Expression.Property(expression.Body, "Title"), expression.Parameters);