C# 如何使用Roslyn CTP将行的尾端添加到属性列表
我正在尝试使用Roslyn CTP语法生成一些带有C# 如何使用Roslyn CTP将行的尾端添加到属性列表,c#,.net,code-generation,roslyn,C#,.net,Code Generation,Roslyn,我正在尝试使用Roslyn CTP语法生成一些带有[DataContractAttribute]的属性。不幸的是,Roslyn将属性与属性放在同一行上 以下是我得到的: [DataContract]public int Id { get; set; } [DataContract]public int? Age { get; set; } 我希望达到的目标是: [DataContract] public int Id { get; set; } [DataContract] public in
[DataContractAttribute]
的属性。不幸的是,Roslyn将属性与属性放在同一行上
以下是我得到的:
[DataContract]public int Id { get; set; }
[DataContract]public int? Age { get; set; }
我希望达到的目标是:
[DataContract]
public int Id { get; set; }
[DataContract]
public int? Age { get; set; }
发电机代码:
string propertyType = GetPropertyType();
string propertyName = GetPropertyName();
var property = Syntax
.PropertyDeclaration(Syntax.ParseTypeName(propertyType), propertyName)
.WithModifiers(Syntax.TokenList(Syntax.Token(SyntaxKind.PublicKeyword)))
.WithAttributeLists(
Syntax.AttributeList(
Syntax.SeparatedList<AttributeSyntax>(
Syntax.Attribute(Syntax.ParseName("DataContract")))))
.WithAccessorList(
Syntax.AccessorList(
Syntax.List(
Syntax.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration)
.WithSemicolonToken(Syntax.Token(SyntaxKind.SemicolonToken)),
Syntax.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration)
.WithSemicolonToken(Syntax.Token(SyntaxKind.SemicolonToken))
)));
一种方法是格式化代码,然后通过在所有属性列表中添加后续琐事来修改代码。比如:
var formattedUnit = (SyntaxNode)compUnit.Format(
new FormattingOptions(false, 4, 4)).GetFormattedRoot();
formattedUnit = formattedUnit.ReplaceNodes(
formattedUnit.DescendantNodes()
.OfType<PropertyDeclarationSyntax>()
.SelectMany(p => p.AttributeLists),
(_, node) => node.WithTrailingTrivia(Syntax.Whitespace("\n")));
string result = formattedUnit.GetText().ToString();
var formattedUnit=(SyntaxNode)compUnit.Format(
新的格式化选项(false,4,4)).GetFormattedRoot();
formattedUnit=formattedUnit.ReplaceNodes(
formattedUnit.DegenantNodes()的格式
第()类
.SelectMany(p=>p.attributeList),
(_,node)=>node.WithTrailingTrivia(Syntax.Whitespace(“\n”));
字符串结果=formattedUnit.GetText().ToString();
按如下方式使用:
.WithTrailingTrivia(SyntaxFactory.ElasticCarriageReturnLineFeed)
如何将结果转换为字符串?@svick我用如何检索字符串结果更新了我的问题。我认为最干净(但可能不是最简单)的解决方案是实现
IFormattingRule
,并在Format()
调用中使用它。但我不知道如何正确地实现它。这里的格式化规则太过繁琐了。只需使用换行符生成原始节点。格式化程序应该保留它。@JasonMalinowski我曾尝试将TrailingTrivia(Syntax.EndOfLine)添加到AttributeList、Attribute等中,但没有效果。它可以工作,属性位于新行,但不幸的是它们丢失了缩进。但是,我可以通过在“\n”之后添加所需的缩进来添加这些内容,这样我就得到了所需的内容。谢谢
.WithTrailingTrivia(SyntaxFactory.ElasticCarriageReturnLineFeed)