首页 >后端开发 >C++ >如何将'obj => obj.Prop”之类的 LINQ 表达式转换为'parent =>parent.obj.Prop”以进行嵌套对象访问?

如何将'obj => obj.Prop”之类的 LINQ 表达式转换为'parent =>parent.obj.Prop”以进行嵌套对象访问?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-18 07:12:08515浏览

How to Convert a LINQ Expression like 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn