/// <summary>
        /// 使用与指定参数匹配程度最高的构造函数创建代理类型的实例,并将其代理委托设定为指定的委托。
        /// </summary>
        /// <param name="arguments">用于创建代理对象的参数数组。</param>
        /// <param name="handler">方法调用所用的代理委托。</param>
        /// <returns>一个使用指定参数创建并使用指定代理委托的代理类型的实例。</returns>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="handler"/> 为 <see langword="null"/>。</exception>
        /// <exception cref="MissingMethodException">
        /// <see cref="DirectProxyTypeProvider.BaseType"/>
        /// 不包含与 <paramref name="arguments"/> 相匹配的构造函数。</exception>
        /// <exception cref="MethodAccessException">
        /// <see cref="DirectProxyTypeProvider.BaseType"/>
        /// 中与 <paramref name="arguments"/> 相匹配的构造函数的访问级别过低。</exception>
        public object CreateProxyInstance(object?[]?arguments, MethodInvokeHandler handler)
        {
            if (handler is null)
            {
                throw new ArgumentNullException(nameof(handler));
            }

            var proxy = ((arguments is null) || (arguments.Length == 0)) ?
                        Activator.CreateInstance(this.ProxyType) ! :
                        Activator.CreateInstance(this.ProxyType, arguments) !;

            this.HandlerField.SetValue(proxy, handler);
            return(proxy);
        }
        /// <summary>
        /// 使用指定的代理对象创建代理类型的实例,并将其代理委托设定为指定的委托。
        /// </summary>
        /// <param name="instance">要为其提供代理的对象。</param>
        /// <param name="handler">方法调用所用的代理委托。</param>
        /// <returns>一个为指定对象提供以指定委托定义的代理的代理类型的实例。</returns>
        /// <exception cref="ArgumentNullException"><paramref name="instance"/>
        /// 或 <paramref name="handler"/> 为 <see langword="null"/>。</exception>
        /// <exception cref="ArgumentException"><paramref name="instance"/>
        /// 无法转换为 <see cref="WrapProxyTypeProvider.BaseType"/> 类型。</exception>
        public object CreateProxyInstance(object instance, MethodInvokeHandler handler)
        {
            if (instance is null)
            {
                throw new ArgumentNullException(nameof(instance));
            }
            if (handler is null)
            {
                throw new ArgumentNullException(nameof(handler));
            }
            if (!this.BaseType.IsAssignableFrom(instance.GetType()))
            {
                var inner = new InvalidCastException();
                throw new ArgumentException(inner.Message, nameof(instance), inner);
            }

            var proxy = Activator.CreateInstance(this.ProxyType) !;

            this.InstanceField.SetValue(proxy, instance);
            this.HandlerField.SetValue(proxy, handler);
            return(proxy);
        }
예제 #3
0
 /// <summary>
 /// 初始化 <see cref="WrapProxyFactory{T}"/> 类的新实例,并将其代理委托设定为指定的委托。
 /// </summary>
 /// <param name="handler">方法调用所用的代理委托。</param>
 /// <exception cref="ArgumentException">
 /// <typeparamref name="T"/> 不是公共接口。</exception>
 /// <exception cref="ArgumentNullException">
 /// <paramref name="handler"/> 为 <see langword="null"/>。</exception>
 public WrapProxyFactory(MethodInvokeHandler handler)
 {
     this.TypeProvider = WrapProxyTypeProvider.OfType(typeof(T));
     this.Handler      = handler ?? throw new ArgumentNullException(nameof(handler));
 }