public static TInterface ToProxy <TInterface>(IProxyable proxyable)
        {
            var proxy = DispatchProxy.Create <TInterface, DelegatingDispatchProxy>();

            ((DelegatingDispatchProxy)(object)proxy).InvokeDelegate = proxyable.Invoke;
            return(proxy);
        }
        public override object BuildUp(IBuilderContext context, object buildKey, object existing)
        {
            object buildObject = base.BuildUp(context, buildKey, existing);

            IPolicyInjectionPolicy policyInjectionPolicy = context.Policies.Get <IPolicyInjectionPolicy>(buildKey);

            if (policyInjectionPolicy != null && policyInjectionPolicy.ApplyPolicies)
            {
                policyInjectionPolicy.SetPolicyConfigurationSource(GetConfigurationSource(context));

                Type typeToBuild;
                TryGetTypeFromBuildKey(buildKey, out typeToBuild);

                object newBuildObject = policyInjectionPolicy.ApplyProxy(buildObject, typeToBuild);

                if (!Object.ReferenceEquals(newBuildObject, buildObject))
                {
                    IProxyable proxyable = newBuildObject as IProxyable;

                    if (proxyable != null)
                    {
                        proxyable.Proxy = newBuildObject;
                    }
                }

                buildObject = newBuildObject;
            }

            return(buildObject);
        }