/// <summary>
        /// Creates the specified type to proxy.
        /// </summary>
        /// <param name="typeToIntercept">The type to proxy.</param>
        /// <param name="serviceProvider">The service provider.</param>
        /// <param name="targetAccessor">The target instance accessor.</param>
        /// <returns>
        /// The proxy wrapping the specified target instance.
        /// </returns>
        public object Create(Type typeToIntercept, IServiceProvider serviceProvider, Func<object> targetAccessor = null)
        {
            Guard.ArgumentNotNull(typeToIntercept, nameof(typeToIntercept));
            Guard.ArgumentNotNull(serviceProvider, nameof(serviceProvider));

            if (!CanIntercept(typeToIntercept))
            {
                return targetAccessor?.Invoke() ?? serviceProvider.GetService(typeToIntercept);
            }
            var interceptors = InterceptorResolver.GetInterceptors(typeToIntercept);
            if (interceptors.IsEmpty)
            {
                return targetAccessor?.Invoke() ?? serviceProvider.GetService(typeToIntercept);
            }
            return Create(typeToIntercept, serviceProvider, interceptors);
        }
        /// <summary>
        /// Create a proxy wrapping specified target instance to wrap the specified target instance.
        /// </summary>
        /// <param name="typeToIntercept">The type to intercept.</param>
        /// <param name="target">The target instance wrapped by the created proxy.</param>
        /// <returns>The proxy wrapping the specified target instance.</returns>
        public object Wrap(Type typeToIntercept, object target)
        {
            Guard.ArgumentNotNull(typeToIntercept, nameof(typeToIntercept));
            Guard.ArgumentNotNull(target, nameof(target));
            Guard.ArgumentAssignableTo(typeToIntercept, target.GetType(), nameof(target));

            if (!CanIntercept(typeToIntercept))
            {
                return target;
            }
            var interceptors = InterceptorResolver.GetInterceptors(typeToIntercept, target.GetType());
            if (interceptors.IsEmpty)
            {
                return target;
            }
            return Wrap(typeToIntercept, target, interceptors);
        }