public void Do(IDo o, Doer doer)
 {
     if (o is A a)
     {
         doer.Do(a);
     }
     else if (o is B b)
     {
         doer.Do(b);
     }
     else if (o is C c)
     {
         doer.Do(c);
     }
     else if (o is D d)
     {
         doer.Do(d);
     }
     else if (o is E e)
     {
         doer.Do(e);
     }
     else if (o is F f)
     {
         doer.Do(f);
     }
 }
        public void Do(IDo o, Doer doer)
        {
            var a = o as A;
            var b = o as B;
            var c = o as C;
            var d = o as D;
            var e = o as E;
            var f = o as F;

            if (a != null)
            {
                doer.Do(a);
            }
            else if (b != null)
            {
                doer.Do(b);
            }
            else if (c != null)
            {
                doer.Do(c);
            }
            else if (d != null)
            {
                doer.Do(d);
            }
            else if (e != null)
            {
                doer.Do(e);
            }
            else if (f != null)
            {
                doer.Do(f);
            }
        }
        public void Do(IDo o, Doer doer)
        {
            var type = o.GetType();

            if (type == typeof(A))
            {
                doer.Do((A)o);
            }
            else if (type == typeof(B))
            {
                doer.Do((B)o);
            }
            else if (type == typeof(C))
            {
                doer.Do((C)o);
            }
            else if (type == typeof(D))
            {
                doer.Do((D)o);
            }
            else if (type == typeof(E))
            {
                doer.Do((E)o);
            }
            else if (type == typeof(F))
            {
                doer.Do((F)o);
            }
        }
 public void Do(IDo o, Doer doer)
 {
     if (o is A)
     {
         ((A)o).Do(doer);
     }
     else if (o is B)
     {
         ((B)o).Do(doer);
     }
     else if (o is C)
     {
         ((C)o).Do(doer);
     }
     else if (o is D)
     {
         ((D)o).Do(doer);
     }
     else if (o is E)
     {
         ((E)o).Do(doer);
     }
     else if (o is F)
     {
         ((F)o).Do(doer);
     }
 }
        public void Do(IDo o, Doer doer)
        {
            var handle = Type.GetTypeHandle(o);

            if (handle.Equals(s_a))
            {
                doer.Do((A)o);
            }
            else if (handle.Equals(s_b))
            {
                doer.Do((B)o);
            }
            else if (handle.Equals(s_c))
            {
                doer.Do((C)o);
            }
            else if (handle.Equals(s_d))
            {
                doer.Do((D)o);
            }
            else if (handle.Equals(s_e))
            {
                doer.Do((E)o);
            }
            else if (handle.Equals(s_f))
            {
                doer.Do((F)o);
            }
        }
        public void Do(IDo o, Doer doer)
        {
            Action <Doer, object> actor;

            s_dict.TryGetValue(o.GetType(), out actor);
            actor(doer, o);
        }
        public void Do(IDo o, Doer doer)
        {
            switch (o)
            {
            case A a: doer.Do(a); break;

            case B b: doer.Do(b); break;

            case C c: doer.Do(c); break;

            case D d: doer.Do(d); break;

            case E e: doer.Do(e); break;

            case F f: doer.Do(f); break;
            }
        }
        static long BenchmarkType(ICaster caster)
        {
            var doer = new Doer();

            GC.Collect();
            var watch = Stopwatch.StartNew();

            for (long i = 0; i < Iterations; ++i)
            {
                caster.Do(new A(), doer);
                caster.Do(new B(), doer);
                caster.Do(new C(), doer);
                caster.Do(new D(), doer);
                caster.Do(new E(), doer);
                caster.Do(new F(), doer);
            }
            return(watch.ElapsedMilliseconds);
        }
 public void Do(IDo o, Doer doer)
 {
 }
 public class F : IDo { public void Do(Doer doer)
                        {
                            ++doer.Count;
                        }
 public void Do(IDo o, Doer doer)
 {
     o.Do(doer);
 }
 public void Do(IDo o, Doer doer)
 {
     s_dict[Type.GetTypeHandle(o)](doer, o);
 }