10

[DataContractAttribute]Roslyn CTP 構文を使用していくつかのプロパティを生成しようとしています。残念ながら、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();
4

2 に答える 2

6

これを行う 1 つの方法は、コードをフォーマットしてから、すべてのプロパティ属性リストに末尾のトリビアを追加して変更することです。何かのようなもの:

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();
于 2013-06-17T21:16:03.583 に答える
4

以下のように使用します。

.WithTrailingTrivia(SyntaxFactory.ElasticCarriageReturnLineFeed)
于 2020-05-13T18:11:38.473 に答える