【问题标题】:Can't add member to the Class programmatically using Roslyn无法使用 Roslyn 以编程方式将成员添加到类
【发布时间】:2017-04-16 00:04:45
【问题描述】:

我尝试使用 Roslyn 向类添加方法。
我解析 .cs 文件并得到决定的类。

SyntaxTree tree = SyntaxTree.ParseFile(Path);
CompilationUnitSyntax root = (CompilationUnitSyntax)tree.GetRoot();
MemberDeclarationSyntax firstMember = root.Members[0];
TypeDeclarationSyntax lClassDeclarationSyntax = (TypeDeclarationSyntax)NamespaceDeclaration.Members[1];

然后我创建一个 MemberDeclaration 类型的实例

MethodDeclarationSyntax lMethodDeclarationSyntax= Syntax.MethodDeclaration(
Syntax.List<AttributeListSyntax>(),
Syntax.TokenList(),
Syntax.IdentifierName("MemoryStream"),
null,
Syntax.Identifier("Serialize"),
null,
Syntax.ParameterList(),
Syntax.List<TypeParameterConstraintClauseSyntax>(),
Syntax.Block(lList));

lList 是方法的主体。 然后我尝试将此实例添加到类中

lClassDeclarationSyntax.Members.Add(lMethodDeclarationSyntax);

但没有任何回应。 我该怎么做?

【问题讨论】:

    标签: c# roslyn


    【解决方案1】:

    Roslyn 语法树是不可变的,因此 Add 方法返回一个新的 SyntaxList,它不会就地更新它。你可能想要像

    var newClass = lClassDeclarationSyntax
    .WithMembers(lClassDeclarationSyntax.Members.Add(lMethodDeclarationSyntax));
    

    这是我们正在努力使方法名称更清晰的内容。

    【讨论】:

    • 因为它不会破坏文件的结构?例如,我在文件中有 2 个类,而我只有一个……然后我需要创建一个新树,给定第二个类,然后将树保存在文件中,确保删除旧的文件?
    • 或者我可以简单地替换树木吗?
    • 它不会破坏文件。如果您想要具有更新类的文件的副本,您可以使用 root.ReplaceNode 来获取您的更改。
    • 后面还有ClassDeclarations.AddMembers加成员。可能是在您回答之后引入了该 api。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    相关资源
    最近更新 更多