ホームページ >バックエンド開発 >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" を "parent =>parent.obj.Prop" にすると、ネストされたオブジェクトにアクセスできますか? " />

LINQ 式 "obj => obj.Prop" を "parent =>parent.obj.Prop" に変換する: ステップバイステップ ガイド

LINQ 式は、オブジェクトのプロパティにアクセスする強力な方法を提供します。ただし、ネストされたオブジェクトのプロパティにアクセスするなど、階層の複数のレベルを横断する必要がある場合があります。

次の LINQ 式について考えてみましょう:

<code class="language-c#">cust => cust.Name</code>

この式は、cust オブジェクトの Name プロパティを取得します。しかし、CustomerModel 内の Customer オブジェクトの Name プロパティにアクセスする必要がある場合はどうすればよいでしょうか?本来の表現では不十分なようです。

この問題を解決するには、元の式を受け入れ、親クラスを入力パラメータとして受け取って新しい式を生成するメソッドが必要です。この新しい式は MVC メソッドのパラメーターとなり、ネストされたプロパティに効率的にアクセスできるようになります。

初期リリースとバグ

考えられるアプローチの 1 つは次のとおりです:

<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 など) にアクセスすると失敗します。発生したエラーは、指定されたメンバーが本文に存在せず、本文が Address オブジェクトではなく Customer オブジェクトを参照していることを示します。

解決策: 式の組み合わせ

必要な解決策は式の構成にあります。関数を作成できるのと同じように、式も作成できます:

<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 メソッドを使用して、1 つの式のすべてのインスタンスを別の式に置き換えます。これらのメソッドを使用すると、次の式を構築できます:

<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>

マジック式は、CustomerModel 内の Customer オブジェクトの Name プロパティに効果的にアクセスできるようになりました。これは MVC メソッドの式パラメータとして使用でき、ネストされたプロパティへのシームレスなアクセスを提供します。

以上が入れ子になったオブジェクトにアクセスするために、「obj => obj.Prop」のような LINQ 式を「parent =>parent.obj.Prop」に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。