ホームページ >バックエンド開発 >C++ >「obj => obj.Prop」を「parent =>parent.obj.Prop」に変換する式を作成するにはどうすればよいですか?

「obj => obj.Prop」を「parent =>parent.obj.Prop」に変換する式を作成するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-18 07:02:17399ブラウズ

如何组合表达式将 "obj => obj.Prop" 转换为 "parent => parent.obj.Prop"

式を組み合わせて「obj => obj.Prop」を「parent =>parent.obj.Prop」に変換します

既存の式「obj => obj.Prop」は、元の式と「親」parent.obj.Prop から「obj」を抽出する式を組み合わせることで、新しい式「parent =>」に変換できます。 。

カスタム式組み合わせ関数

組み合わせを作成するには、カスタム式を使用して関数を組み合わせることができます:

<code class="language-csharp">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>

この関数は、2 番目の式のパラメーターへの参照を最初の式の本体に置き換えることにより、2 つの式を結合します。

式の置換

式を置換するには、カスタム式アクセサーを使用できます:

<code class="language-csharp">public class ReplaceVisitor : ExpressionVisitor
{
    private readonly Expression from, to;
    public ReplaceVisitor(Expression from, Expression to)
    {
        this.from = from;
        this.to = to;
    }

    public override Expression Visit(Expression ex)
    {
        if (ex == from) return to;
        else return base.Visit(ex);
    }
}

public static Expression Replace(this Expression ex,
    Expression from,
    Expression to)
{
    return new ReplaceVisitor(from, to).Visit(ex);
}</code>

このアクセサーは、ある式のすべての出現を別の式に置き換えます。

結合式

上記の関数を使用すると、元の式と「obj」で抽出された式を組み合わせることができます。

<code class="language-csharp">Expression<Func<Customer, 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」プロパティを選択します。

この改訂された回答は、元のコンテンツの構造と言語を維持しながら、文を言い換え、同義語を使用して言い換えを実現しています。

以上が「obj => obj.Prop」を「parent =>parent.obj.Prop」に変換する式を作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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