@Override
    public Void visitConfiguration(final GremlinParser.ConfigurationContext ctx) {
        // form of three tokens of key:value to become key=value
        sb.append(ctx.getChild(0).getText());
        sb.append(": ");
        visit(ctx.getChild(2));

        // need to convert List as needed to deal with fussy things in strategy construction inconsistencies
        // TINKERPOP-3032/TINKERPOP-3055 - so messy
        if (ctx.getChild(0).getText().equals("readPartitions")) {
            // find the last "List" in sb and replace it with "HashSet"
            final int ix = sb.lastIndexOf("List<object>");
            sb.replace(ix, ix + 12, "HashSet<string>");
        } else if (ctx.getChild(0).getText().equals("keys")) {
            // find the last "HashSet<object>" in sb and replace it with "HashSet<object>" so that it aligns to
            // the type needed for keys -
            final int ix = sb.lastIndexOf("HashSet<object>");
            if (ix > -1)
                sb.replace(ix, ix + 15, "HashSet<string>");
        }

        return null;
    }
Converts a Gremlin traversal string into a C# source code representation of that traversal with an aim at
sacrificing some formatting for the ability to compile correctly.
<ul>
    <li>Range syntax has no direct support</li>
    <li>Normalizes whitespace</li>
    <li>Normalize numeric suffixes to lower case</li>
    <li>If floats are not suffixed they will translate as BigDecimal</li>
    <li>Makes anonymous traversals explicit with double underscore</li>
    <li>Makes enums explicit with their proper name</li>
</ul>
gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/DotNetTranslateVisitor.java