更改 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. 只是为了避免"标题"字符串而依赖强类型模型。
您需要创建一个
表达式,该表达式获取查询的Body
并访问其上的给定属性。然后,您需要重新构建 lambda 表达式。整个事情看起来像这样:
var titleExpression = Expression.Lambda<Func<T, string>>(
Expression.Property(expression.Body, "Title"), expression.Parameters);