Esempio n. 1
0
        private void AddCompatibleOverloads(ClrMethod /*!*/ constructedMethod, ClrMethod /*!*/ genericMethod,
                                            DTypeDescs /*!*/ typeArgs, bool exactMatch)
        {
            foreach (ClrMethod.Overload overload in genericMethod.Overloads)
            {
                // add the overloads that are compatible with typeArgs
                int gen_count = overload.GenericParamCount;
                if (exactMatch ? gen_count == typeArgs.Count : gen_count > typeArgs.Count)
                {
                    bool compatible = true;

                    for (int i = 0; i < gen_count; i++)
                    {
                        DTypeDesc desc = (i < typeArgs.Count ? typeArgs[i] : PrimitiveTypeDesc.SystemObjectTypeDesc);
                        if (!desc.IsCompatibleWithGenericParameter(overload.GenericParameters[i]))
                        {
                            compatible = false;
                            break;
                        }
                    }

                    if (compatible)
                    {
                        // make generic method
                        Type[] real_type_args;
                        if (exactMatch)
                        {
                            real_type_args = typeArgs.GetRealTypes();
                        }
                        else
                        {
                            real_type_args = new Type[gen_count];

                            typeArgs.GetRealTypes(real_type_args, 0);
                            for (int i = typeArgs.Count; i < gen_count; i++)
                            {
                                real_type_args[i] = Types.Object[0];
                            }
                        }
                        MethodInfo info = ((MethodInfo)overload.Method).MakeGenericMethod(real_type_args);

                        ClrMethod.Overload constructed_overload;
                        constructedMethod.AddOverload(info, out constructed_overload);
                    }
                }
            }
        }