【发布时间】:2013-06-13 20:14:45
【问题描述】:
我正在尝试使用 Roslyn CTP 语法生成带有 [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))
)));
在将这些属性包装在一个类、一个命名空间和最后一个 CompilationUnit 中之后,我使用以下代码来获取字符串结果:
var compUnit = Syntax.CompilationUnit().WithMembers(...);
IFormattingResult fResult = compUnit.Format(new FormattingOptions(false, 4, 4));
string result = fResult.GetFormattedRoot().GetText().ToString();
【问题讨论】:
-
如何将结果转换为
string? -
@svick 我用如何检索字符串结果更新了我的问题
-
我认为最干净(但可能不是最简单)的解决方案是实现
IFormattingRule并在您的Format()调用中使用它。但我不知道如何正确实施。 -
格式化规则在这里是多余的。只需使用换行符生成您的原始节点。格式化程序应该保留它。
-
@JasonMalinowski 我尝试将 TrailingTrivia(Syntax.EndOfLine) 添加到 AttributeList、Attribute 等 - 没有效果。
标签: c# .net code-generation roslyn