ExpressionTree rewrite - MakeMemberAccess () für Navigationseigenschaften

.net-3.5 c# expression-trees

Frage

Related vage zu einer vorherigen Frage

Hinweis : Ich verwende eine Ableitung des ExpressionTree-Besuchers wie hier erläutert

In meiner VisitMemberAccess Methode erstelle ich derzeit MemberExpressions, die etwas wie folgt verwenden:

// `mapping` is a class used to map EntityA's members to EntityB's members
return Expression.MakeMemberAccess(Visit(m.Expression), mapping.TargetMemberInfo);

In den meisten Fällen funktioniert das.

Bei einigen Testklassen ...

public class EntityA
{
    public long Id { get; set; }
    public string Name { get; set; }
}

public class EntityB
{
    public long MyId {get; set; }
    public string MyName { get; set; }
}

Der Code wird korrekt (EntityA x) => x.Id zu (EntityB x) => x.MyId was großartig ist und (EntityB x) => x.MyId funktioniert. Mein Problem tritt auf, wenn Sie Navigationseigenschaften einführen:

public class EntityB
{
    public long MyId {get; set; }
    public EntityBDetails NavigationProperty { get; set; }
}    

public class EntityBDetails
{
    public string MyName { get; set; }
}

Angesichts des obigen trivialen Falls möchte ich (EntityA x) x => x.Name auf (EntityB x) x => x.NavigationProperty.Name . Und da gibt es das Problem, ich habe keine Ahnung, was ich MakeMemberAccess liefern MakeMemberAccess , damit das funktioniert ... Ich kann mapping.TargetMemberInfo.DeclaringType == mapping.TargetMemberInfo.ReflectedType MakeMemberAccess vergleichen, um festzustellen, ob eine Navigationseigenschaft vorhanden ist, aber wie geht das? die erforderliche MemberExpression erstellen?

Danke im Voraus!

NB: Die Codebasis, an der ich arbeite, ist VB; C # neigt dazu, bessere / schnellere Antworten auf SO zu bekommen, also habe ich von Hand konvertiert. Lass es mich wissen, wenn ich dumme Tippfehler gemacht habe / etc

Akzeptierte Antwort

Ich denke, es könnte helfen, den C # -Code ins Englische zu übersetzen und dann in einen Ausdruck-erzeugenden Code zu übersetzen:

Der Ausdruck x.NavigationProperty.Name bedeutet eigentlich "Zugriff auf Eigenschaft NavigationProperty auf x und dann Zugriff auf Eigenschaft Name im Ergebnis. Nun, der Code:

ParameterExpression x = …;
var navigationProperty = typeof(EntityB).GetProperty("NavigationProperty");
var name = typeof(EntityBDetails).GetProperty("Name");

var navigationPropertyAccess = Expression.MakeMemberAccess(x, navigationProperty);
var nameAccess = Expression.MakeMemberAccess(navigationPropertyAccess , name);


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum