obj.Prop" to "parent => parent.obj.Prop" for Nested Object Access? " />
将LINQ表达式“obj => obj.Prop”转换为“parent => parent.obj.Prop”:分步指南
LINQ表达式提供了一种强大的方法来访问对象的属性。但是,有时需要遍历多层层次结构,例如访问嵌套对象的属性。
考虑以下LINQ表达式:
<code class="language-c#">cust => cust.Name</code>
此表达式检索cust对象的Name属性。但是,如果您需要访问CustomerModel中Customer对象的Name属性呢?原始表达式就显得力不从心了。
为了解决这个问题,需要一种方法,该方法接受原始表达式并生成一个新的表达式,将父类作为输入参数。这个新表达式将成为MVC方法的参数,从而高效地访问嵌套属性。
初始版本和错误
一种可能的方法是:
<code class="language-c#">public Expression<Func<object>> ExpressionFromField<T, TModel>(FieldDefinition<T> field) where TModel : BaseModel<T> { var param = Expression.Parameter(typeof(TModel), "t"); var body = Expression.PropertyOrField(param, nameof(SelectedItem)); var member = Expression.MakeMemberAccess(body, field.Member); return Expression.Lambda<Func<object>>(member, param); }</code>
但是,当访问嵌套属性(例如cust.Address.State)时,此版本会失败。遇到的错误表明,指定的成员在body中不存在,body指的是Customer对象而不是Address对象。
解决方案:表达式组合
所需的解决方案在于表达式组合。就像函数可以组合一样,表达式也可以组合:
<code class="language-c#">public static Expression<Func<T, TResult>> Compose<T, TIntermediate, TResult>( this Expression<Func<T, TIntermediate>> first, Expression<Func<TIntermediate, TResult>> second) { return Expression.Lambda<Func<T, TResult>>( second.Body.Replace(second.Parameters[0], first.Body), first.Parameters[0]); }</code>
这依赖于Replace方法将一个表达式的所有实例替换为另一个表达式。有了这些方法,就可以构造以下表达式:
<code class="language-c#">Expression<Func<object>> propertySelector = cust => cust.Name; Expression<Func<CustomerModel, Customer>> modelSelector = model => model.Customer; Expression<Func<CustomerModel, object>> magic = modelSelector.Compose(propertySelector);</code>
magic表达式现在可以有效地访问CustomerModel中Customer对象的Name属性。它可以作为MVC方法的表达式参数,提供对嵌套属性的无缝访问。
以上是如何将'obj => obj.Prop”之类的 LINQ 表达式转换为'parent =>parent.obj.Prop”以进行嵌套对象访问?的详细内容。更多信息请关注PHP中文网其他相关文章!