Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
		}