public void Add(Object obj)
        {
            allComponents.Add(obj.id, obj);

            Type type = obj.GetType();

            FastInvokeHandler loadInvoke = FastInvokeCache.GetMethod(type, "Load");

            if (loadInvoke != null)
            {
                loaders.Enqueue(new InvokeInfo(obj.id, loadInvoke));
            }
            FastInvokeHandler startInvoke = FastInvokeCache.GetMethod(type, "Start");

            if (startInvoke != null)
            {
                starts.Enqueue(new InvokeInfo(obj.id, startInvoke));
            }
            FastInvokeHandler updateInvoke = FastInvokeCache.GetMethod(type, "Update");

            if (updateInvoke != null)
            {
                updates.Enqueue(new InvokeInfo(obj.id, updateInvoke));
            }
        }
        public void Awake <A, B, C>(Object obj, A a, B b, C c)
        {
            Type type = obj.GetType();
            FastInvokeHandler awakeInvoke = FastInvokeCache.GetMethod(type, "Awake", typeof(A), typeof(B), typeof(C));

            if (awakeInvoke != null)
            {
                try
                {
                    awakeInvoke(obj, new object[] { a, b, c });
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.ToString());
                }
            }
        }
        public void Destroy(Object obj)
        {
            Type type = obj.GetType();
            FastInvokeHandler destoryInvoke = FastInvokeCache.GetMethod(type, "Destroy");

            if (destoryInvoke != null)
            {
                try
                {
                    destoryInvoke(obj, null);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.ToString());
                }
            }
        }
        public void Awake(Object obj)
        {
            Type type = obj.GetType();
            FastInvokeHandler awakeInvoke = FastInvokeCache.GetMethod(type, "Awake");

            if (awakeInvoke != null)
            {
                try
                {
                    awakeInvoke(obj, null);
                }
                catch (Exception e)
                {
                    Log.Error(e);
                }
            }
        }