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