如何使用Roslyn在对象初始化器中添加换行?
用Roslyn实现对象初始化器的格式化换行
要让Roslyn把对象初始化器从单行格式拆成多行,只需在你的格式化选项中添加针对对象初始化器的配置即可。
先看你当前的格式化方法:
public SyntaxNode GetFormatedNode(SyntaxNode node) { var workspace = new AdhocWorkspace(); OptionSet options = workspace.Options; options = options .WithChangedOption(CSharpFormattingOptions.NewLinesForBracesInMethods, true) .WithChangedOption(CSharpFormattingOptions.NewLinesForBracesInProperties, true) .WithChangedOption(new OptionKey(FormattingOptions.UseTabs, LanguageNames.CSharp), true) .WithChangedOption(new OptionKey(FormattingOptions.IndentationSize, LanguageNames.CSharp), 4); return Formatter.Format(node, workspace, options); }
修改后的代码添加了两个关键选项:
public SyntaxNode GetFormatedNode(SyntaxNode node) { var workspace = new AdhocWorkspace(); OptionSet options = workspace.Options; options = options .WithChangedOption(CSharpFormattingOptions.NewLinesForBracesInMethods, true) .WithChangedOption(CSharpFormattingOptions.NewLinesForBracesInProperties, true) .WithChangedOption(new OptionKey(FormattingOptions.UseTabs, LanguageNames.CSharp), true) .WithChangedOption(new OptionKey(FormattingOptions.IndentationSize, LanguageNames.CSharp), 4) // 开启对象初始化器大括号换行 .WithChangedOption(CSharpFormattingOptions.NewLinesForBracesInObjectInitializers, true) // 可选:给对象初始化器的冒号后加空格,优化可读性 .WithChangedOption(CSharpFormattingOptions.SpaceAfterColonInObjectInitializer, true); return Formatter.Format(node, workspace, options); }
选项说明:
NewLinesForBracesInObjectInitializers:设置为true后,new Column { ... }会拆成两行,大括号单独起一行,内部成员自动缩进。SpaceAfterColonInObjectInitializer:让ID="xxx"变成ID = "xxx",属于可选配置,可按个人代码风格调整。
修改后,你提供的示例代码:
class Example { void Method() { Column col = new Column { ID = "mySuperColumnID", Code = "mySuperColumnCode" }; } }
会被格式化为你期望的样子:
class Example { void Method() { Column col = new Column { ID = "mySuperColumnID", Code = "mySuperColumnCode" }; } }
内容的提问来源于stack exchange,提问作者Shems Asfouri
相关产品推荐
相关产品推荐

