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 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)
        {
            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 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)
        {
            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;
            }
        }