Heim >Backend-Entwicklung >C++ >Wie überarbeite ich einen LINQ-Ausdruck von „obj => obj.Prop' zu „parent => parent.obj.Prop'?
obj.Prop“ zu „parent => parent.obj.Prop“? " /> Refactoring von „obj => obj.Prop“ zu „parent => parent.obj.Prop“?
Refaktorieren Sie den LINQ-Ausdruck „obj => obj.Prop“ in „parent => parent.obj.Prop“
Beim Ändern eines vorhandenen LINQ-Ausdrucks vom Typ Expression<Func<object>>
, um eine übergeordnete Klasse zu akzeptieren, treten Herausforderungen auf, wenn der Ausdruck verschachtelte Eigenschaften umfasst. Die vorhandene ExpressionFromField<TModel>
-Methode hat Probleme mit der Verarbeitung von Ausdrücken wie cust => cust.Address.State
, da sie nicht explizit auf das Zwischenobjekt zugreifen kann (in diesem Fall cust.Address
).
Die Lösung liegt in der Ausdruckskomposition, die mehrere Ausdrücke zu einem kombiniert. Hier ist die Schritt-für-Schritt-Anleitung:
1. Ausdruckskombinationsmethode
Definieren Sie eine statische Methode mit dem Namen Compose<T, TIntermediate, TResult>
, die drei Ausdrucksdelegaten akzeptiert:
<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. Ausdrucksersetzung
Erstellt eine Klasse mit dem Namen ReplaceVisitor
, die von ExpressionVisitor
abgeleitet ist:
<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); } }</code>
Fügen Sie eine Erweiterungsmethode Expression
zur Klasse Replace
hinzu:
<code class="language-csharp">public static Expression Replace(this Expression ex, Expression from, Expression to) { return new ReplaceVisitor(from, to).Visit(ex); }</code>
3. Anwendungskombination
Mit den vorhandenen Kombinations- und Substitutionsmethoden können Sie jetzt neue Ausdrücke erstellen:
<code class="language-csharp">// 选择属性的表达式: Expression<Func<Customer, object>> propertySelector = cust => cust.Name; // 从模型中选择对象的表达式 Expression<Func<Model, Customer>> modelSelector = model => model.Customer; // 组合表达式 Expression<Func<Model, object>> magic = modelSelector.Compose(propertySelector);</code>
Durch Kombination...
Diese überarbeitete Antwort behält die ursprüngliche Sprache und Struktur bei und formuliert Phrasen und Sätze neu, um eine Paraphrasierung zu erreichen, ohne die Bedeutung zu ändern. Das Bild bleibt in seinem ursprünglichen Format und seiner ursprünglichen Position.
Das obige ist der detaillierte Inhalt vonWie überarbeite ich einen LINQ-Ausdruck von „obj => obj.Prop' zu „parent => parent.obj.Prop'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!