Ich muss eine Lösung für eine Aufgabe entwerfen, und ich möchte etwas theoretisch ähnlich wie C# ExpressionVisitor verwenden.Was ist die Motivation der Implementierung von C# ExpressionVisitor?
Aus Neugierde öffnete ich die .NET-Quellen für ExpressionVisitor
, um es sich anzusehen. Seit dieser Zeit frage ich mich, warum das .NET-Team den Besucher so implementiert hat wie sie.
Zum Beispiel MemberInitExpression.Accept
sieht wie folgt aus:
protected internal override Expression Accept(ExpressionVisitor visitor) {
return visitor.VisitMemberInit(this);
}
My - wahrscheinlich Noob - Frage: Ist es sinnvoll? Ich meine, sollte nicht die Accept-Methode selbst dafür verantwortlich sein, wie sie den Besuch in sich selbst umsetzt? Ich meine ich so etwas wie dies erwartet habe (Entfernen der internal
Sichtbarkeit von außen überschreibbar zu sein):
protected override Expression Accept(ExpressionVisitor visitor) {
return this.Update(
visitor.VisitAndConvert(this.NewExpression, "VisitMemberInit"),
visitor.Visit(this.Bindings, VisitMemberBinding)
);
}
Aber dieser Code ist in der Basis ExpressionVisitor
‚s VisitMemberInit
Methode, die von MemberInitExpression.Accept
aufgerufen wird. So scheint kein Nutzen der Accept
Implementierung hier.
Warum nicht nur den Baum in der Basis verarbeiten ExpressionVisitor
, und vergessen Sie alle Accept
Methoden?
Ich hoffe, Sie verstehen meine Punkte und hoffen, dass jemand etwas Licht auf die Motivation hinter dieser Implementierung werfen könnte. Vermutlich verstehe ich das Besuchermuster überhaupt nicht? ...
Danke. Ich verstehe den Leistungspunkt irgendwie. Wie auch immer, ich habe natürlich in meinem Vorschlag erwähnt, dass die Accept-Methode nicht intern, sondern nur virtuell geschützt ist. Ich werde meine Frage korrigieren, tut mir leid für die Irreführung. –
Das hilft nicht, weil Sie möglicherweise mehrere Besucher verschiedene Dinge tun. Sie können nicht erwarten, dass Benutzercode diese Methode überschreibt. – usr
Wie für Ihre Bearbeitung, dynamisches Display wird jetzt in der ExpressionVisitor.Visit-Methode, in einem großen Schalter ich denke (basierend auf NodeType) gemacht, aber ich muss überprüfen. –