private static ConstructorInfo GetActualConstructor(this MethodReference methodReference, Type declaringType) { ConstructorInfo constructorInfo = null; var constructorInfos = declaringType.GetMember(methodReference.Name, MemberTypes.Constructor, _flags) .ToArrayOf <ConstructorInfo>(); if (constructorInfos.Length > 1) { Type[] types = Type.EmptyTypes; if (methodReference.HasParameters) { if (methodReference.IsGeneric()) { types = declaringType.GetGenericArguments(); } else { types = methodReference.Parameters .Select(p => p.ParameterType.GetActualType()) .ToArray(); } } constructorInfo = Type.DefaultBinder.SelectMethod(_flags, constructorInfos, types, null) as ConstructorInfo; } else { constructorInfo = constructorInfos[0]; } return(constructorInfo); }
internal static MethodBase GetActualMethod(this MethodReference methodReference) { MethodInfo methodInfo = null; Type[] types = Type.EmptyTypes; Type type = methodReference.DeclaringType.GetActualType(); if (methodReference.Name.Equals(".ctor")) { return(methodReference.GetActualConstructor(type)); } if (methodReference.IsGeneric()) { return(methodReference.GetGenericActualMethod()); } if (!type.ContainsGenericParameters(out types)) { types = methodReference.Parameters .Select(p => p.ParameterType.GetActualType()) .ToArray(); } MethodInfo[] methodInfos = type.GetMember(methodReference.Name, MemberTypes.Method, _flags) .Cast <MethodInfo>() .Where(m => !m.IsGenericMethodDefinition) .ToArray(); if (methodInfos.Length > 1) { methodInfo = Type.DefaultBinder.SelectMethod(_flags, methodInfos, types, null) as MethodInfo; } else { methodInfo = methodInfos[0]; } return(methodInfo); }