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); }
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); }