首頁 >後端開發 >C++ >如何轉換 MVC 參數中嵌套屬性的表達式?

如何轉換 MVC 參數中嵌套屬性的表達式?

Barbara Streisand
Barbara Streisand原創
2025-01-18 06:57:08491瀏覽

How to Transform Expressions for Nested Properties in MVC Parameters?

在MVC參數中產生巢狀屬性表達式

目標是建立一個方法,將類似於“cust => cust.Name”的表達式轉換為“parent => parent.obj.Name”,其中“parent”代表具有類型為“T”的欄位的MVC模型。此轉換後的表達式應作為MVC方法的參數相容。

組合式

提出的解決方案的核心是組合表達式,類似於函數的組合方式。以下程式碼示範了組合機制:

<code class="language-csharp">public static Expression<Func<TSource, TResult>> Compose<TSource, TIntermediate, TResult>(
    this Expression<Func<TSource, TIntermediate>> first,
    Expression<Func<TIntermediate, TResult>> second)
{
    return Expression.Lambda<Func<TSource, TResult>>(
        second.Body.Replace(second.Parameters[0], first.Body),
        first.Parameters[0]);
}</code>

此方法利用以下程式碼取代表達式實例:

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

實際範例

給定一個屬性選擇器:

<code class="language-csharp">Expression<Func<object, string>> propertySelector = cust => cust.Name;</code>

和一個模型選擇器:

<code class="language-csharp">Expression<Func<Model, Customer>> modelSelector = model => model.Customer;</code>

您可以如下組合它們:

<code class="language-csharp">Expression<Func<Model, string>> magic = modelSelector.Compose(propertySelector);</code>

使用此技術,您可以轉換表達式以存取巢狀屬性,使其適合MVC方法參數。

以上是如何轉換 MVC 參數中嵌套屬性的表達式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn