Dynamic Visitor

CSharp · Console

/Program.cs

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
					
public class Program
{
	public static void Main()
	{
		var objects = new ArrayList()
		{
			"Foo", 1L, 1.1, 2.2M, 
			DateTime.Now,
			new Nullable<DateTime>(DateTime.Now.AddDays(1)),
			new List<object>()
			{
				new List<String> { "list1", "list2" },
				Enumerable.Range(0,2)
			},
			new Dictionary<String, String> {
				["key"] = "value"
			}
		};
		
		Console.WriteLine("DynamicVisitor:");
		new DynamicVisitor().Visit(objects);
		
		Console.WriteLine("\n\nDynamicVisitorSubclass:");
		new DynamicVisitorSubclass().Visit(objects);
	}
}

public class DynamicVisitor
{
    public virtual void Visit(IEnumerable value)
    {
        Console.WriteLine($"IEnumerable {value}");
        foreach (dynamic d in value)
            Visit(d);
    }

    public virtual void Visit(IList value)
    {
        Console.WriteLine($"IList       {value.Count}");
        foreach (dynamic d in value)
            Visit(d);
    }

    public void Visit(Object value) => Console.WriteLine($"Object      {value}");
    public void Visit(Int32 value) => Console.WriteLine($"Int32       {value}");
    public void Visit(DateTime value) => Console.WriteLine($"DateTime    {value}");
    public void Visit(String value) => Console.WriteLine($"String      {value}");
    public void Visit(Double value) => Console.WriteLine($"Double      {value}");
}

public class DynamicVisitorBase
{
    public virtual void Visit(IEnumerable value)
    {
        Console.WriteLine($"IEnumerable {value}");
        foreach (dynamic d in value)
            Visit(d);
    }

    public virtual void Visit(IList value)
    {
        Console.WriteLine($"IList       {value.Count}");
        foreach (dynamic d in value)
            Visit(d);
    }
}

public class DynamicVisitorSubclass
{
    public void Visit(Object value) => Console.WriteLine($"Object      {value}");
    public void Visit(Int32 value) => Console.WriteLine($"Int32       {value}");
    public void Visit(DateTime value) => Console.WriteLine($"DateTime    {value}");
    public void Visit(String value) => Console.WriteLine($"String      {value}");
    public void Visit(Double value) => Console.WriteLine($"Double      {value}");
}

;