Devo progettare una soluzione per un'attività e vorrei usare qualcosa di teoricamente simile a ExpressionVisitor di C#.Qual è la motivazione dell'implementazione di C# ExpressionVisitor?
Per curiosità ho aperto le fonti .NET per ExpressionVisitor
di dare un'occhiata a questo. Da quel momento mi sono chiesto perché il team .NET ha implementato il visitatore come hanno fatto.
Per esempio MemberInitExpression.Accept
si presenta così:
protected internal override Expression Accept(ExpressionVisitor visitor) {
return visitor.VisitMemberInit(this);
}
mio - probabilmente niubbo - domanda è: ha alcun senso? Voglio dire, il metodo Accept non dovrebbe essere responsabile di come implementa la visita all'interno di se stesso? Voglio dire che ho aspettato qualcosa di simile (togliendo la visibilità internal
essere superabile dall'esterno):
protected override Expression Accept(ExpressionVisitor visitor) {
return this.Update(
visitor.VisitAndConvert(this.NewExpression, "VisitMemberInit"),
visitor.Visit(this.Bindings, VisitMemberBinding)
);
}
Ma questo è il codice riportato VisitMemberInit
metodo di s' base ExpressionVisitor
, che viene chiamato da MemberInitExpression.Accept
. Quindi sembra che non ci siano vantaggi dell'implementazione qui.
Perché non elaborare solo l'albero nella base ExpressionVisitor
e dimenticare tutti i metodi Accept
?
Spero che tu capisca i miei punti, e la speranza che qualcuno potesse fare luce sulla motivazione dietro a questa implementazione. Probabilmente non capisco il modello Visitor a tutti? ...
Grazie. Capisco il punto di prestazione. Comunque, naturalmente, nella mia proposta, penso che il metodo Accept non sia interno, ma solo virtuale protetto. Correggerò la mia domanda, mi dispiace per averlo fuorviato. –
Questo non aiuta perché potresti avere più visitatori che fanno cose diverse. Non puoi aspettarti che il codice utente sostituisca questo metodo. – usr
Come per la tua modifica, il displatch dinamico è fatto proprio ora nel metodo ExpressionVisitor.Visit, in un enorme switch credo (basato su NodeType), ma devo controllare. –