gpt4 book ai didi

c# - Roslyn - 如何在另一个语句之前和之后添加一个语句

转载 作者:行者123 更新时间:2023-11-30 23:04:19 35 4
gpt4 key购买 nike

我有以下代码来检测方法调用。我想在该调用语句之前和之后向源代码添加一个简单的语句(例如 Console.WriteLine("Test"); ),并将其保存回源文件。是否有任何代码片段或示例展示了如何做到这一点?

var methodDeclarations = classitem.DescendantNodes().OfType<MethodDeclarationSyntax>();
foreach (var memmeth in methodDeclarations)
{

var varInvocations = memmeth.DescendantNodes().OfType<InvocationExpressionSyntax>();
foreach (InvocationExpressionSyntax invoc in varInvocations)
{
// insert new statement before and after the invocation

最佳答案

您正在尝试混合使用语句和表达式。

如果我写

this.Test();

在我的代码中,它是 ExpressionStatement 中的 InvocationExpression 中的 SimpleExpressionStatement。

Statement 基本上是表示单行代码的元素,在我们的示例中是 this.Test();,可能类似于 return;扔;等等

所以如果你想在一个表达式之前或之后插入一个语句,你必须在包含语句之前或之后插入它。

但是,这可能会产生问题,因为您可以在同一个语句中有多个表达式,例如

if(Test() && Test2()){

}

因此,为了在方法调用之前或之后插入新语句,您可以简单地找到最近的语句并将其插入所述语句之前或之后,例如:

var statements = new List<StatementSyntax>();
var methodDeclarations = root.DescendantNodes().OfType<MethodDeclarationSyntax>();
foreach (var memmeth in methodDeclarations)
{
var varInvocations = memmeth.DescendantNodes().OfType<InvocationExpressionSyntax>();
foreach (InvocationExpressionSyntax invoc in varInvocations)
{
// Find the relevant node
var statement = invoc.Ancestors().OfType<StatementSyntax>().FirstOrDefault();
statements.Add(statement);
}
}
// Track the nodes so you can change it in the tree even after modifying it
root = root.TrackNodes(statements.Distinct());
foreach(var statement in statements)
{
var currentStatement = root.GetCurrentNode(statement);
root = root.InsertNodesAfter(currentStatement,
new[] { SyntaxFactory.ExpressionStatement(
SyntaxFactory.InvocationExpression(
SyntaxFactory.MemberAccessExpression(
SyntaxKind.SimpleMemberAccessExpression,
SyntaxFactory.IdentifierName("Console"),
SyntaxFactory.IdentifierName("WriteLine"))
))});
currentStatement = root.GetCurrentNode(statement);
root = root.InsertNodesBefore(currentStatement,
new[] { SyntaxFactory.ExpressionStatement(
SyntaxFactory.InvocationExpression(
SyntaxFactory.MemberAccessExpression(
SyntaxKind.SimpleMemberAccessExpression,
SyntaxFactory.IdentifierName("Console"),
SyntaxFactory.IdentifierName("WriteLine"))
))});
}

关于c# - Roslyn - 如何在另一个语句之前和之后添加一个语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49449586/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com