ExpressionTree rewrite - MakeMemberAccess () per le proprietà di navigazione

.net-3.5 c# expression-trees

Domanda

Riferito vagamente a una domanda precedente

Nota : sto utilizzando una derivata del visitatore di ExpressionTree come spiegato qui

Nel mio metodo VisitMemberAccess attualmente creo MemberExpressions usando qualcosa sulla falsariga di:

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

Per la maggior parte, questo funziona.

Considerate alcune classi di test ...

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

Il codice eseguirà correttamente il mapping (EntityA x) => x.Id a (EntityB x) => x.MyId che è ottimo e funziona molto bene. Il mio problema arriva quando si introducono le proprietà di navigazione:

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

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

Dato il caso banale sopra, vorrei (EntityA x) x => x.Name da mappare a (EntityB x) x => x.NavigationProperty.Name . E therelies il problema, non ho idea di cosa fornire a MakeMemberAccess per fare questo lavoro ... Posso confrontare mapping.TargetMemberInfo.DeclaringType == mapping.TargetMemberInfo.ReflectedType per determinare se è coinvolta una proprietà di navigazione, ma come faccio creare la MemberExpression necessaria?

Grazie in anticipo!

NB: Il codice base su cui sto lavorando è VB; C # tende a ottenere risposte migliori / più veloci su SO, quindi ho convertito a mano. Fammi sapere se ho fatto errori di battitura / etc

Risposta accettata

Penso che potrebbe aiutare a tradurre il codice C # in inglese e poi tradurlo in un codice di creazione di espressioni:

L'espressione x.NavigationProperty.Name realtà significa "accedere alla proprietà NavigationProperty su x quindi accedere al Name proprietà sul risultato. Ora, il codice:

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


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché