private static string GetGenericArgumentsIfNecessary(IMethodInfo method, TranslationContext context) { if (!method.IsGenericMethod) { return(null); } var methodGenericDefinition = method.GetGenericMethodDefinition(); var genericParameterTypes = methodGenericDefinition.GetGenericArguments().ToList(); if (context.Settings.UseImplicitGenericParameters) { RemoveSuppliedGenericTypeParameters( methodGenericDefinition.GetParameters().Project(p => p.ParameterType), genericParameterTypes); } if (!genericParameterTypes.Any()) { return(null); } var argumentNames = method .GetGenericArguments() .Project(a => a.GetFriendlyName()) .Filter(name => name != null) .ToArray(); return(argumentNames.Any() ? $"<{string.Join(", ", argumentNames)}>" : null); }
private static IMethodInfo ObtainMethod(IMethodInfo proxiedMethod, Type type) { Type[] genericArguments = null; if (proxiedMethod.IsGenericMethod) { genericArguments = proxiedMethod.GetGenericArguments(); proxiedMethod = proxiedMethod.GetGenericMethodDefinition(); } var declaringType = proxiedMethod.DeclaringType; IMethodInfo methodOnTarget = null; if (declaringType.IsInterface()) { var mapping = type.GetInterfaceMap(declaringType); var index = Array.IndexOf(mapping.InterfaceMethods, proxiedMethod); Debug.Assert(index != -1); methodOnTarget = mapping.TargetMethods[index].AsIMethodInfo(); } else { // NOTE: this implementation sucks, feel free to improve it. var methods = MethodFinder.GetAllInstanceMethods(type, BindingFlags.Public | BindingFlags.NonPublic); foreach (var method in methods) { if (MethodSignatureComparer.Instance.Equals(method.GetBaseDefinition(), proxiedMethod)) { methodOnTarget = method; break; } } } if (methodOnTarget == null) { throw new ArgumentException( string.Format("Could not find method overriding {0} on type {1}. This is most likely a bug. Please report it.", proxiedMethod, type)); } if (genericArguments == null) { return(methodOnTarget); } return(methodOnTarget.MakeGenericMethod(genericArguments)); }
private static IMethodInfo ObtainMethod(IMethodInfo proxiedMethod, Type type) { Type[] genericArguments = null; if (proxiedMethod.IsGenericMethod) { genericArguments = proxiedMethod.GetGenericArguments(); proxiedMethod = proxiedMethod.GetGenericMethodDefinition(); } var declaringType = proxiedMethod.DeclaringType; IMethodInfo methodOnTarget = null; if (declaringType.IsInterface()) { var mapping = type.GetInterfaceMap(declaringType); var index = Array.IndexOf(mapping.InterfaceMethods, proxiedMethod); Debug.Assert(index != -1); methodOnTarget = mapping.TargetMethods[index].AsIMethodInfo(); } else { // NOTE: this implementation sucks, feel free to improve it. var methods = MethodFinder.GetAllInstanceMethods(type, BindingFlags.Public | BindingFlags.NonPublic); foreach (var method in methods) { if (MethodSignatureComparer.Instance.Equals(method.GetBaseDefinition(), proxiedMethod)) { methodOnTarget = method; break; } } } if (methodOnTarget == null) { throw new ArgumentException( string.Format("Could not find method overriding {0} on type {1}. This is most likely a bug. Please report it.", proxiedMethod, type)); } if (genericArguments == null) { return methodOnTarget; } return methodOnTarget.MakeGenericMethod(genericArguments); }