/// <summary> /// Used to make generic types in a single location. This helps to make sure that all generic types are made in the same way and that /// all generic types that are based upon type builder actually use th typeBuilder.MakeGenericType() method and not Type.MakeGenericType() method. /// </summary> /// <param name="genericTypeDefinition"></param> /// <param name="typeParameters"></param> /// <returns></returns> public System.Type MakeGenericType(System.Type genericTypeDefinition, Type[] typeParameters) { return(AssemblyLib.MakeGenericType(genericTypeDefinition, typeParameters)); // if (genericTypeDefinition is TypeBuilder typeBuilder) // { //// For TypeBuilder.GetConstructor(), TypeBuilder.GetMethod() and TypeBuilder.GetField() to work, //// the typebuilder needs to keep track of generic types that it produces. To do this, the typeBuilder //// MakeGeneric method needs to be used over just the normal Type.MakeGenericType() method. // //for (int i = 0; i < typeParameters.Length; i++) // //{ // // Console.WriteLine($"MakeGenericType TP[{i}]: {typeParameters[i].Name}"); // //} // return typeBuilder.MakeGenericType(typeParameters); // } // //for (int i = 0; i < typeParameters.Length; i++) // //{ // // var parameter = typeParameters[i]; // // if (parameter.DeclaringType != null && ReferenceEquals(genericTypeDefinition, parameter.DeclaringType)) // // { // // throw new Exception("Declaring type of parameter is same as generic type definition."); // // } // //} // var result = genericTypeDefinition.MakeGenericType(typeParameters); // //if (result.IsGenericTypeDefinition) // //{ // // throw new Exception("MakeGenericType returned a generic type definition and not a generic instance."); // //} // return result; }