簡體   English   中英

如何使用Roslyn正確修改類聲明語法?

[英]How do I modify class declaration syntax correctly with Roslyn?

我下面有一種方法可以修改類聲明語法。 我向該類中的所有方法添加了兩個StatementSyntax屬性,然后將該類保存到解決方案中。 一切都很好,但是方法ReplaceNode僅適用於第一個方法ListOfMethod 我的方法的哪一部分不正確?

private ClassDeclarationSyntax GetNewClass(ClassDeclarationSyntax c)
{
    List<MethodDeclarationSyntax>  ListOfMethod = lom(c);
    foreach (var OldMethod in ListOfMethod )
    {
        MethodDeclarationSyntax NewMethod = GetNewMethod (OldMethod);
        c = c.ReplaceNode(OldMethod,NewMethod);
    }
    return c;
}

在Roslyn中,大多數數據結構都是不可變的,因此,當您對某物調用修改方法時,該操作將返回一個新的修改后的對象,而不是就地執行修改。

因此,在您的情況下,您將從給定的ClassDeclarationSyntax收集所有您感興趣的方法。 當您調用ReplaceNode ,它將返回一個新的類聲明。 這個新的類聲明不會包含您以前找到的任何方法,因為它是一個新的類聲明實例。

一種選擇是使用ReplaceNodes在單個調用中進行ReplaceNodes ,在您的情況下,這似乎是遵循的方法。

另一個選擇是嘗試使用一些永久性標記來標記方法,這些永久性標記在樹修改期間不會丟失。 為此,您可以使用WithAdditionalAnnotations()將注釋添加到節點,然后在樹中找到具有給定注釋的給定節點。

我更改了如下方法。每次使用方法ReplaceNode時,都會創建新的classdeclarationsSyntax,然后必須從這個新的類中獲取下一個MethodDeclarationSyntax

into Count =c.Members.OfType <MethodDeclarationSyntax>().Count();
for  (int i=0;i <Count; i++)
{
    List <MethodDeclarationSyntax > l=c.Members.OfType <MethodDeclarationSyntax>().ToList();
    MethodDeclarationSyntax NewMethod=GetNewMethod (l [i]);
    c=c.ReplaceNode(l [i],NewMethod);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM