我正在尝试使用Roslyn替换类的CompilationUnitSyntax。
但是,我正在使用的 ReplaceNode 与Roslyn常见问题解答中的 ReplaceNode 以及我查看过的任何StackOverflow问题都有不同的签名。任何人都可以指出为什么会这样,我如何使用 ReplaceNode 将旧的ClassDeclarationSyntax 和 new ClassDeclarationSyntax 作为参数?
我正在看九月CTPFAQ¹,方法:
[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>)'
¹我很确定我正在使用九月CTP:
我正在使用%userprofile%\ Documents \ Microsoft Roslyn CTP - 2012年9月的常见问题解答\ CSharp \ APISampleUnitTestsCS \ FAQ.cs
NuGet说我的Roslyn软件包的版本为1.2.20906.2
答案 0 :(得分:6)
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;
。