首頁 >後端開發 >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:08509瀏覽

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