c# - 在 InvocatioExpression 中插入新方法调用

标签 c# roslyn

我正在使用提供程序编写一个 Visual Studio 代码修复程序,它将在此类语句中插入 AsEnumerable 调用:

model.clients.Take(10).Select(c => new Client(c));

我能够检测到此类语句,但在 Select 方法之前插入 AsEnumerable 时遇到问题。这是我尝试过的:

        var expressionSyntax = SyntaxFactory.ParseExpression(".AsEnumerable()");
        var memberAccessExpressionSyntax = invocationExpr.Expression as MemberAccessExpressionSyntax;

        var root = await document.GetSyntaxRootAsync(cancellationToken);

        var newRoot = root.InsertNodesAfter(memberAccessExpressionSyntax.Expression, new[] {expressionSyntax});

        return document.WithSyntaxRoot(newRoot);

但我明白了

"System.InvalidOperationException: The item specified is not the element of a list."

查看堆栈跟踪:https://gist.github.com/anonymous/02c41f232829163b25ae

调用 InsertNodesAfter 方法的正确方法是什么?

最佳答案

这就是我解决这个问题的方法:

var memberAccessExpressionSyntax = invocationExpr.Expression as MemberAccessExpressionSyntax;

var root = await document.GetSyntaxRootAsync(cancellationToken);

var accessExpression = SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, memberAccessExpressionSyntax.Expression, SyntaxFactory.IdentifierName("AsEnumerable"));

var invocationExpression = SyntaxFactory.InvocationExpression(accessExpression);
var enumerableMemberAccessExpression = memberAccessExpressionSyntax.WithExpression(invocationExpression);

root = root.ReplaceNode(invocationExpr, invocationExpr.WithExpression(enumerableMemberAccessExpression));

关于c# - 在 InvocatioExpression 中插入新方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32183120/

相关文章:

c# - 在没有 INotifyPropertyChanged 的​​情况下更新 ObservableCollection 成员属性的绑定(bind)

.net-core - .NET Core的新.csproj格式的Roslyn工作区

c# - 在影响一个文件的代码修复中返回 Task<Document> 而不是 Task<Solution> 有什么好处

visual-studio - 如何在 Visual Studio 扩展的代码编辑器中获取有关鼠标位置下的单词的信息

c# - 尝试创建类型为 'EmployeeController' 的 Controller 时出错。确保 Controller 有一个无参数的公共(public)构造函数

java - 如何通过包装类直接访问类成员方法

c# - 为什么要使用接口(interface)和抽象而不是抽象?

c# - 使用 Roslyn 查找特定方法的所有方法调用

c# - Roslyn AddDocument 到项目并将此更改保存到实际解决方案文件

c# - 获取数据网格的滚动查看器