private void TestDIContainer_NewTypeRegistered(object sender, EventArgs e)
        {
            TestDIContainer.NewTypeRegistered -= TestDIContainer_NewTypeRegistered;

            if (TestDIContainer.HasRealImplementation(interfaceType))
            {
                realImplementation = TestDIContainer.GetInstance(interfaceType);

                foreach (var invocation in queue)
                {
                    if (invocation.Item1 == ActionType.Invoke)
                    {
                        var mi = TypeHelper.GetMethodInfo(realImplementation.GetType(), invocation.Item3, (object[])invocation.Item4);
                        mi.Invoke(realImplementation, (object[])invocation.Item4);
                    }
                    else if (invocation.Item1 == ActionType.Set)
                    {
                        var pi = TypeHelper.GetPropertyInfo(realImplementation.GetType(), null, invocation.Item3);
                        pi.SetValue(realImplementation, invocation.Item4);
                    }
                    else if (invocation.Item1 == ActionType.Event)
                    {
                        var ei = TypeHelper.GetEventInfo(realImplementation.GetType(), invocation.Item3);
                        ei.AddEventHandler(realImplementation, (Delegate)invocation.Item4);
                    }
                }
            }
        }
        private static void QueueDynamicProxyTest()
        {
            Console.WriteLine("-------QueueDynamicProxyTest start-------");
            ILogin login = (ILogin)TestDIContainer.GetInstance(typeof(ILogin));

            login.LoginName = "test";
            login.Password  = "******";
            login.TryLogin += login_TryLogin;
            login.DoLogin();
            Console.WriteLine("Press any key to register real implementation!");
            Console.ReadLine();
            TestDIContainer.RegisterFunc(typeof(ILogin), () => { return(new Login()); });
            Console.WriteLine("-------QueueDynamicProxyTest end-------");
            Console.ReadLine();
        }
        public QueueDynamicProxy(Type interfaceType)
        {
            this.interfaceType = interfaceType;

            if (TestDIContainer.HasRealImplementation(interfaceType))
            {
                if (realImplementation == null)
                {
                    realImplementation = TestDIContainer.GetInstance(interfaceType);
                }
            }
            else
            {
                TestDIContainer.NewTypeRegistered += TestDIContainer_NewTypeRegistered;
            }
        }