Exemplo 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);
                    }
                }
            }
        }
Exemplo n.º 2
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);
					}
				}
			}
		}