You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#源生成器生成的成员之间插入空行?

解决C#源生成器语法树生成时成员间无空行的问题
  • 核心问题在于不要仅给单个成员加尾随trivia,而是要在成员之间明确插入空行对应的语法 trivia,以下是两种可靠的实现方式:

方式1:给非首成员添加前置空行trivia

这种方式更直观,确保每个后续成员前都有一个空行,避免末尾多余空行:

// 假设jsonProperties是你从JSON读取的键值对集合
var memberList = new List<MemberDeclarationSyntax>();
foreach (var (index, prop) in jsonProperties.Select((p, i) => (i, p)))
{
    // 构建公共字符串常量字段
    var field = SyntaxFactory.FieldDeclaration(
            SyntaxFactory.VariableDeclaration(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.StringKeyword)))
                .WithVariables(SyntaxFactory.SingletonSeparatedList(
                    SyntaxFactory.VariableDeclarator(prop.Key)
                        .WithInitializer(SyntaxFactory.EqualsValueClause(
                            SyntaxFactory.LiteralExpression(SyntaxKind.StringLiteralExpression, SyntaxFactory.Literal(prop.Value))
                        ))
                ))
        )
        .WithModifiers(SyntaxFactory.TokenList(
            SyntaxFactory.Token(SyntaxKind.PublicKeyword),
            SyntaxFactory.Token(SyntaxKind.ConstKeyword)
        ));

    // 除第一个成员外,添加空行前置trivia
    if (index > 0)
    {
        var emptyLine = SyntaxFactory.SyntaxTriviaList(
            SyntaxFactory.NewLineTrivia(),
            SyntaxFactory.NewLineTrivia()
        );
        field = field.WithLeadingTrivia(emptyLine);
    }

    memberList.Add(field);
}

// 构建最终的静态类
var staticClass = SyntaxFactory.ClassDeclaration("YourStaticClassName")
    .WithModifiers(SyntaxFactory.TokenList(SyntaxFactory.Token(SyntaxKind.StaticKeyword)))
    .WithMembers(SyntaxFactory.List(memberList))
    .NormalizeWhitespace(); // 规范化空白,确保自定义trivia生效

方式2:给非尾成员添加尾随空行trivia

如果习惯在成员后加空白,可给除最后一个外的所有成员添加尾随空行:

var members = jsonProperties.Select((prop, index) =>
{
    var field = SyntaxFactory.FieldDeclaration(
            SyntaxFactory.VariableDeclaration(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.StringKeyword)))
                .WithVariables(SyntaxFactory.SingletonSeparatedList(
                    SyntaxFactory.VariableDeclarator(prop.Key)
                        .WithInitializer(SyntaxFactory.EqualsValueClause(
                            SyntaxFactory.LiteralExpression(SyntaxKind.StringLiteralExpression, SyntaxFactory.Literal(prop.Value))
                        ))
                ))
        )
        .WithModifiers(SyntaxFactory.TokenList(
            SyntaxFactory.Token(SyntaxKind.PublicKeyword),
            SyntaxFactory.Token(SyntaxKind.ConstKeyword)
        ));

    // 非最后一个成员添加空行尾随trivia
    if (index != jsonProperties.Count - 1)
    {
        field = field.WithTrailingTrivia(
            SyntaxFactory.SyntaxTriviaList(
                SyntaxFactory.NewLineTrivia(),
                SyntaxFactory.NewLineTrivia()
            )
        );
    }
    return field;
}).ToList();

var staticClass = SyntaxFactory.ClassDeclaration("YourStaticClassName")
    .WithModifiers(SyntaxFactory.TokenList(SyntaxFactory.Token(SyntaxKind.StaticKeyword)))
    .WithMembers(SyntaxFactory.List(members))
    .NormalizeWhitespace();
  • 注意:如果之前调用NormalizeWhitespace()无效,检查是否是在添加自定义trivia之后调用的——必须先设置trivia,再执行规范化,否则默认空白会覆盖自定义设置。

内容的提问来源于stack exchange,提问作者Axemasta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 07:57:15