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); } } } }