public GenericTypeBuilder CreateTypeBuilder(TypeReaderManager manager, IList <string> genericArguments)
        {
            suffixBuilder.Length = 0;
            suffixBuilder.Append('`');
            suffixBuilder.Append(genericArguments.Count);
            suffixBuilder.Append("[[");

            for (int i = 0; i < genericArguments.Count; i++)
            {
                suffixBuilder.Append(genericArguments[i]);

                if (i != genericArguments.Count - 1)
                {
                    suffixBuilder.Append("],[");
                }
            }

            suffixBuilder.Append("]]");
            var genericSuffix = suffixBuilder.ToString();

            nameBuilder.Length = 0;
            nameBuilder.Append(GenericTargetType);
            nameBuilder.Append(genericSuffix);
            var targetType = nameBuilder.ToString();

            var typeBuilder = CreateTypeBuilder();

            var actualGenericArguments = new Type[genericArguments.Count];

            for (int i = 0; i < actualGenericArguments.Length; i++)
            {
                actualGenericArguments[i] = manager.ResolveActualType(genericArguments[i]);
            }

            var actualType = ActualGenericTypeDefinition.MakeGenericType(actualGenericArguments);

            typeBuilder.Specialize(targetType, genericArguments, actualType, actualGenericArguments);

            return(typeBuilder);
        }