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