我正在尝试使用 Roslyn 替换类的 CompilationUnitSyntax。
但是,我使用的 ReplaceNode 与 Roslyn 常见问题解答和我查看过的任何 StackOverflow 问题中的 ReplaceNode 具有不同的签名。任何人都可以指出这是为什么,我如何使用 ReplaceNode 将 old ClassDeclarationSyntax 和 new ClassDeclarationSyntax 作为参数?
我正在查看 9 月 CTP 常见问题解答¹,方法:
[FAQ(26)]
public void AddMethodToClass()
特别是下面一行:
CompilationUnitSyntax newCompilationUnit =
compilationUnit.ReplaceNode(classDeclaration, newClassDeclaration);
当我尝试构建此代码时,出现错误,因为 ReplaceNode 需要不同的参数:
'Roslyn.Compilers.CSharp.CompilationUnitSyntax' does not contain a definition for 'ReplaceNode' and the best extension method overload
'Roslyn.Compilers.CSharp.SyntaxExtensions.ReplaceNode<TRoot>(TRoot,
Roslyn.Compilers.CSharp.SyntaxNode,
Roslyn.Compilers.SyntaxRemoveOptions,
System.Func<Roslyn.Compilers.CSharp.SyntaxNode,Roslyn.Compilers.CSharp.SyntaxTriviaList>,
System.Func<Roslyn.Compilers.CSharp.SyntaxNode,Roslyn.Compilers.CSharp.SyntaxTriviaList>)'
¹ 我相当确定我使用的是 9 月 CTP:
我使用的常见问题解答来自 %userprofile%\Documents\Microsoft Roslyn CTP - September 2012\CSharp\APISampleUnitTestsCS\FAQ.cs
NuGet 说我的 Roslyn 包的版本是 1.2.20906.2
最佳答案
ReplaceNode()
有两个重载(都是扩展方法):
-
public static TRoot ReplaceNode<TRoot, TNode>( this TRoot root, TNode oldNode, TNode newNode) where TRoot : CommonSyntaxNode where TNode : CommonSyntaxNode;
在
Roslyn.Compilers.CommonSyntaxNodeExtensions
中。 -
public static TRoot ReplaceNode<TRoot>( this TRoot root, SyntaxNode node, SyntaxRemoveOptions options, Func<SyntaxNode, SyntaxTriviaList> keepLeadingTrivia = null, Func<SyntaxNode, SyntaxTriviaList> keepTrailingTrivia = null) where TRoot : SyntaxNode
在
Roslyn.Compilers.CSharp.SyntaxExtensions
中。
您想要第一个,但错误消息谈到了第二个,这表明您缺少 using Roslyn.Compilers;
。
关于c# - Roslyn 的 CompilationUnitSyntax.ReplaceNode 中的歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21948634/