[英]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.