在生成与语言无关的代码时,使用Roslyn生成格式良好的可空类型语法

时间:2017-02-22 20:08:47

标签: c# code-generation roslyn roslyn-code-analysis

我使用Roslyn为某种数据访问层创建应该是语言无关的代码生成器。 它将使用元数据输出所需的代码。 期望返回代码的C#和VB.NET版本。

当前实现正在生成所需的输出,但可空类型格式不正确,输出包含额外的空格。

是否有一个选项可以确保SyntaxGenerator.NullableTypeExpression生成的可空类型返回格式正确 - 没有空格 - 声明?

代码段

这是SyntaxGenerator.NullableTypeExpression用于返回与属性类型对应的SyntaxNode的地方。

    private SyntaxNode ToTypeExpression(Type type, bool nullable, SyntaxGenerator generator)
    {

        SyntaxNode baseType;
        SyntaxNode propType;

        SpecialType specialType = ToSpecialType(type);

        if(specialType == SpecialType.None)
        {
            baseType = generator.IdentifierName(type.Name);                
        }
        else
        {
            baseType = generator.TypeExpression(specialType);
        }

        if (nullable && type.IsValueType)
        {
            propType = generator.NullableTypeExpression(baseType);
        }
        else
        {
            propType = baseType;
        }

        return propType;

    }

这是生成的VB.NET代码:

    Public Property Salary As Integer?
        Get
            Return GetAttributeValue(Of Integer?)("salary").Value
        End Get

        Set(value As Integer?)
            SetPropertyValue("Salary", "salary", value)
        End Set
    End Property

这是C#代码,注意空格

    public int ? Salary
    {
        get
        {
            return GetAttributeValue<int ? >("salary").Value;
        }

        set
        {
            SetPropertyValue("Salary", "salary", value);
        }
    }

1 个答案:

答案 0 :(得分:0)

在此处使用Formatter.Format作为建议:Generating well-formatted syntax with Roslyn,删除了不需要的空格。

        string textOutput;
        var sb = new StringBuilder();

        var result = generator.CompilationUnit(declarations);

        var formattedResult = Formatter.Format(result, workspace);

        using (StringWriter writer = new StringWriter(sb))
        {
            formattedResult.WriteTo(writer);
            textOutput = writer.ToString();
        }