public static void Main()
TheVisitor<object> visitor = new TheVisitor<object>();
Nodebase nodea = new NodeA();
Nodebase nodeb = new NodeB();
public abstract class Nodebase { }
public class NodeA : Nodebase { }
public class NodeB : Nodebase { }
public abstract class Visitor<T> {
public abstract T Visit(NodeA node);
public abstract T Visit(NodeB node);
public T Visit(Nodebase node)
Console.WriteLine("Visit(Nodebase)");
return Visit((dynamic) node);
public class TheVisitor<T> : Visitor<T> {
public override T Visit(NodeA node)
Console.WriteLine("Visit(NodeA)");
public override T Visit(NodeB node)
Console.WriteLine("Visit(NodeB)");