コード例 #1
0
            private void ProxyMethodTest(Int32 test)
            {
                //获取当前方法的签名字符串,注意!此处之所以不直接用获取到的方法信息,
                //是因为当前获取到的是动态生成的代理类的接口的方法的实现,并没有继承接口方法的特性
                //详情请查看单元测试项目 Biobank.Function.TestUnit/ServiceModel/ServiceModelTest
                String methodSignName = System.Reflection.MethodBase.GetCurrentMethod().ToString();

                //获取接口方法信息
                var methodInfo = EmitMetadataCache.GetMethodInfo(_interfaceType, methodSignName);
                //  _handler.InovkeHandle(this, _interfaceType, methodInfo,);
            }
コード例 #2
0
        public Object CreateProxy(Type interfaceType)
        {
            Object proxy = null;

Start:
            Func <IInvokeHandler, Type, Object> proxyFunc = GetProxyCreateDelegate(interfaceType);

            if (proxyFunc == null)
            {
                lock (_SyncObject)
                {
                    if (proxyFunc == null)
                    {
                        Type proxyType = GetProxyType(interfaceType);
                        if (proxyType == null)
                        {
                            EmitMetadataCache.Add(interfaceType);
                            proxyType = DynamicallyCreateProxyType(interfaceType);
                            AddProxyTypeCache(interfaceType, proxyType);
                        }
                        //public DynamicProxy(IInvokeHandler handler,Type interfaceType)
                        //Object proxy=(Object)(new ProxyType(handler,interfaceType));
                        var proxyTypeConstructor = proxyType.GetConstructor(new Type[] { typeof(IInvokeHandler), typeof(Type) });

                        var handlerParameterExpression = Expression.Parameter(typeof(IInvokeHandler));
                        var typeParameterExpression    = Expression.Parameter(typeof(Type));
                        var newExpression = Expression.New(proxyTypeConstructor, new Expression[] {
                            handlerParameterExpression, typeParameterExpression
                        });
                        Expression castExpression = Expression.Convert(newExpression, typeof(Object));
                        proxyFunc = Expression.Lambda <Func <IInvokeHandler, Type, Object> >(
                            newExpression,
                            handlerParameterExpression,
                            typeParameterExpression).Compile();
                        AddProxyCreateDelegateCache(interfaceType, proxyFunc);
                    }
                    else
                    {
                        goto Start;
                    }
                }
            }
            var invokeHandler = this.InvokeHandlerFactory;

            invokeHandler.Initialize();

            proxy = proxyFunc.Invoke(invokeHandler, interfaceType);

            return(proxy);
        }