Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Roslyn CTP将行的尾端添加到属性列表_C#_.net_Code Generation_Roslyn - Fatal编程技术网

C# 如何使用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

我正在尝试使用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))
        )));

一种方法是格式化代码,然后通过在所有属性列表中添加后续琐事来修改代码。比如:

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)