internal static Type InflateType (Type type, Type[] type_args, Type[] method_args)
{
if (type == null)
return null;
if (!type.IsGenericParameter && !type.ContainsGenericParameters)
return type;
if (type.IsGenericParameter) {
if (type.DeclaringMethod == null)
return type_args == null ? type : type_args [type.GenericParameterPosition];
return method_args == null ? type : method_args [type.GenericParameterPosition];
}
if (type.IsPointer)
return InflateType (type.GetElementType (), type_args, method_args).MakePointerType ();
if (type.IsByRef)
return InflateType (type.GetElementType (), type_args, method_args).MakeByRefType ();
if (type.IsArray) {
if (type.GetArrayRank () > 1)
return InflateType (type.GetElementType (), type_args, method_args).MakeArrayType (type.GetArrayRank ());
if (type.ToString ().EndsWith ("[*]", StringComparison.Ordinal)) /*FIXME, the reflection API doesn't offer a way around this*/
return InflateType (type.GetElementType (), type_args, method_args).MakeArrayType (1);
return InflateType (type.GetElementType (), type_args, method_args).MakeArrayType ();
}
Type[] args = type.GetGenericArguments ();
for (int i = 0; i < args.Length; ++i)
args [i] = InflateType (args [i], type_args, method_args);
Type gtd = type.IsGenericTypeDefinition ? type : type.GetGenericTypeDefinition ();
return gtd.MakeGenericType (args);
}