var propertiesWithCollectionTypes =
    new List<(IPropertySymbol Symbol, PropertyDeclarationSyntax Syntax)>();

// somewhere here I add the properties that are 
// generic collection type with custom type args.
// other code removed for brevity

foreach (var propertyTuple in propertiesWithCollectionTypes)
{
    var namedType = propertyTuple.Symbol.Type as INamedTypeSymbol;
	
    codeBuilder.AppendLine($"\tpublic static class " +
        $"EntityExtensions{Guid.NewGuid().ToString().Replace("-", string.Empty)}");
    codeBuilder.AppendLine("\t{");

    if (namedType?.IsGenericType ?? false)
    {
        codeBuilder.AppendLine($"\t\tpublic static " +
            $"{namedType.BuildDtoTypeWithGenericTypeArgs(propertyTuple.Syntax, propertyTuple.Symbol)} " +
            $"ToDto(this {namedType.Name()} entities)");

        if (namedType.IsDictionary())
        {
            codeBuilder.AppendLine("\t\t{");
            codeBuilder.AppendLine($"\t\t\t if (entities == null) " +
                $"return new {namedType.BuildDtoTypeWithGenericTypeArgs(propertyTuple.Syntax, propertyTuple.Symbol)}();");
            codeBuilder.AppendLine("\t\t\t return null; //🤷‍♂️");
            codeBuilder.AppendLine("\t\t}");
        }
        else
        {
            codeBuilder.AppendLine("\t\t{");
            codeBuilder.AppendLine($"\t\t\t if (entities == null) " +
                $"return Array.Empty<" +
                $"{namedType.TypeArguments.First().Name}Dto>();");
            codeBuilder.AppendLine("\t\t\t return entities.Select(x => x.ToDto()).ToList();");
            codeBuilder.AppendLine("\t\t}");
        }
    }
    else
    {
        codeBuilder.AppendLine($"\t\tpublic static " +
            $"{propertyTuple.Symbol.Type.Name().Replace("[]", string.Empty)}Dto[] " +
            $"ToDto(this {propertyTuple.Symbol.Type.Name()} entities)");
        codeBuilder.AppendLine("\t\t{");
        codeBuilder.AppendLine($"\t\t\t if (entities == null) " +
            $"return Array.Empty<" +
            $"{propertyTuple.Symbol.Type.Name().Replace("[]", string.Empty)}Dto>();");
        codeBuilder.AppendLine("\t\t\t return entities.Select(x => x.ToDto()).ToArray();");
        codeBuilder.AppendLine("\t\t}");
    }

    codeBuilder.AppendLine("\t}");
}