Esempio n. 1
0
        public bool InitializeProxyMethod(MethodInfo sourceMethod, Type[] types, out MethodInfo proxyMethod)
        {
            var proxyType = this.ProxyType;

            if (types == null)
            {
                throw new ArgumentOutOfRangeException("types");
            }
            var proxyTypeArgs = new List <Type>();

            if (ReflectionHelper.IsGenericType(sourceMethod.DeclaringType))
            {
                proxyTypeArgs.AddRange(sourceMethod.DeclaringType.GetTypeInfo().GenericTypeArguments);
            }
            if (sourceMethod.IsGenericMethod)
            {
                proxyTypeArgs.AddRange(sourceMethod.GetGenericArguments());
            }
            var typeArrayPointer = 0;

            if (proxyType.IsGenericTypeDefinition)
            {
                var typeArgs = new Type[proxyType.GenericTypeParameters.Length];
                for (int i = 0; i < typeArgs.Length; i++)
                {
                    typeArgs[i] = proxyTypeArgs[typeArrayPointer];
                    typeArrayPointer++;
                }
                proxyType = proxyType.MakeGenericType(typeArgs).GetTypeInfo();
            }
            if (proxyTypeArgs.Count == typeArrayPointer)
            {
                proxyMethod = proxyType.GetDeclaredMethods(MethodName).FirstOrDefault(m => CheckTypes(m.GetParameters(), types));
            }
            else
            {
                var typeArgs = new Type[proxyTypeArgs.Count - typeArrayPointer];
                for (int i = 0; i < typeArgs.Length; i++)
                {
                    typeArgs[i] = proxyTypeArgs[typeArrayPointer];
                    typeArrayPointer++;
                }
                proxyMethod = proxyType.GetDeclaredMethods(MethodName).FirstOrDefault(m =>
                {
                    if (!m.IsGenericMethodDefinition || m.GetGenericArguments().Length != typeArgs.Length)
                    {
                        return(false);
                    }

                    var genericMethod = m.MakeGenericMethod(typeArgs);

                    return(CheckTypes(genericMethod.GetParameters(), types));
                });
                if (proxyMethod != null)
                {
                    proxyMethod = proxyMethod.MakeGenericMethod(typeArgs);
                    return(true);
                }
            }
            if (proxyMethod == null)
            {
                return(false);
            }
            return(true);
        }
Esempio n. 2
0
        public bool InitializeProxyMethod(MethodInfo sourceMethod, Type[] types, out MethodInfo proxyMethod)
        {
            if (types == null)
            {
                throw new ArgumentNullException("types");
            }
            var proxyTypeArgs = new List <Type>();

            if (ReflectionHelper.IsGenericType(sourceMethod.DeclaringType))
            {
                proxyTypeArgs.AddRange(sourceMethod.DeclaringType.GetGenericArguments());
            }
            if (sourceMethod.IsGenericMethod)
            {
                proxyTypeArgs.AddRange(sourceMethod.GetGenericArguments());
            }
            var typeArrayPointer = 0;
            var proxyType        = this.ProxyType;

            if (proxyType.IsGenericTypeDefinition)
            {
                var typeArgs = new Type[proxyType.GetGenericArguments().Length];
                for (int i = 0; i < typeArgs.Length; i++)
                {
                    typeArgs[i] = proxyTypeArgs[typeArrayPointer];
                    typeArrayPointer++;
                }
                proxyType = proxyType.MakeGenericType(typeArgs);
            }
            if (proxyTypeArgs.Count > typeArrayPointer)
            {
                var methodParamArgs = new Type[proxyTypeArgs.Count - typeArrayPointer];
                for (int i = 0; i < methodParamArgs.Length; i++)
                {
                    methodParamArgs[i] = proxyTypeArgs[i + typeArrayPointer];
                }
                proxyMethod = proxyType.GetMethods().Select(m =>
                {
                    if (m.IsGenericMethodDefinition && m.Name == MethodName)
                    {
                        var methodTypeParameters = m.GetGenericArguments();
                        if (methodTypeParameters.Length != methodParamArgs.Length)
                        {
                            return(null);
                        }
                        var genericMethod = m.MakeGenericMethod(methodParamArgs);
                        var parameters    = genericMethod.GetParameters();
                        if (parameters.Length != types.Length)
                        {
                            return(null);
                        }
                        for (int i = 0; i < parameters.Length; i++)
                        {
                            if (parameters[i].ParameterType != types[i])
                            {
                                return(null);
                            }
                        }
                        return(genericMethod);
                    }
                    return(null);
                }).FirstOrDefault(m => m != null);
            }
            else
            {
                proxyMethod = proxyType.GetMethod(MethodName, types);
            }
            return(proxyMethod != null);
        }