我正在使用提供程序编写一个 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/