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 中国語 Web サイトの他の関連記事を参照してください。