为什么Roslyn生成没有空格的方法代码

WSK*_*WSK 11 c# roslyn

罗斯林在标识符和关键字之间没有任何空格的情况下生成代码,我做错了什么?它还在方法块的末尾加上一个分号.这是我的代码:

SeparatedSyntaxList<ParameterSyntax> parametersList = new SeparatedSyntaxList<ParameterSyntax>().AddRange
(new ParameterSyntax[]
    {
        SyntaxFactory.Parameter(SyntaxFactory.Identifier("sender")).WithType(SyntaxFactory.ParseTypeName("object")),
        SyntaxFactory.Parameter(SyntaxFactory.Identifier("args")).WithType(SyntaxFactory.ParseTypeName("EventArgs"))
    }
);

MethodDeclarationSyntax newMethod = SyntaxFactory.MethodDeclaration(
    SyntaxFactory.List<AttributeListSyntax>(),
    SyntaxFactory.TokenList(SyntaxFactory.Token(SyntaxKind.PrivateKeyword)),
    SyntaxFactory.ParseName("void"),
    null,
    SyntaxFactory.Identifier("simpleButton1_Click"),
    null,
    SyntaxFactory.ParameterList(parametersList),
    SyntaxFactory.List<TypeParameterConstraintClauseSyntax>(),
    SyntaxFactory.Block(),
    SyntaxFactory.Token(SyntaxKind.SemicolonToken)
);
Run Code Online (Sandbox Code Playgroud)

以下是我的结果:

privatevoidsimpleButton1_Click(objectsender,EventArgse){};
Run Code Online (Sandbox Code Playgroud)

Pat*_*ide 8

为了更加全面,NormalizeWhiteSpace应该提到.它将默认格式应用于给定节点:

MethodDeclarationSyntax newMethod = SyntaxFactory.MethodDeclaration(
    SyntaxFactory.List<AttributeListSyntax>(),
    SyntaxFactory.TokenList(SyntaxFactory.Token(SyntaxKind.PrivateKeyword)),
    SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.VoidKeyword)),
    null,
    SyntaxFactory.Identifier("simpleButton1_Click"),
    null,
    SyntaxFactory.ParameterList(parametersList),
    SyntaxFactory.List<TypeParameterConstraintClauseSyntax>(),
    SyntaxFactory.Block(),
    null
  )

newMethod = newMethod.NormalizeWhitespace();
Run Code Online (Sandbox Code Playgroud)

一个ToString()将产生预期输出:

private void simpleButton1_Click(object sender, EventArgs args)
{
}
Run Code Online (Sandbox Code Playgroud)


use*_*817 5

我认为将分号放在那里是因为您将分号传递给创建方法声明的方法,我猜这是在声明没有主体的抽象方法时使用的。

要正确格式化输出,您可以使用命名空间中的FormatterMicrosoft.CodeAnalysis.Formatting

Workspace workspace = MSBuildWorkspace.Create();
SyntaxNode formattedNode = Microsoft.CodeAnalysis.Formatting.Formatter.Format(newMethod, workspace);
Run Code Online (Sandbox Code Playgroud)

对于返回类型,您可以执行以下操作

SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.VoidKeyword));   
Run Code Online (Sandbox Code Playgroud)

这会给你一个 TypeSyntax