Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Roslyn中编辑循环_C#_For Loop_Roslyn - Fatal编程技术网

C# 在Roslyn中编辑循环

C# 在Roslyn中编辑循环,c#,for-loop,roslyn,C#,For Loop,Roslyn,我试图了解Roslyn编译器是如何工作的 我正在尝试编写一个简单的函数,它将分析代码并将循环语句从递增变为递减 例如改变: for(int i=0; i<10; i++) int a = i; 我已经编写了查找该循环的代码,但我不知道如何编辑它 这就是我到目前为止所做的: SyntaxTree tree = CSharpSyntaxTree.ParseText( @"using System; using System.Collections.Generic;

我试图了解Roslyn编译器是如何工作的

我正在尝试编写一个简单的函数,它将分析代码并将循环语句从递增变为递减

例如改变:

for(int i=0; i<10; i++)
    int a = i;
我已经编写了查找该循环的代码,但我不知道如何编辑它

这就是我到目前为止所做的:

SyntaxTree tree = CSharpSyntaxTree.ParseText(
    @"using System;
    using System.Collections.Generic;
    using System.Text;

        static void Main(string[] args)
        {
        for(int i=0; i<10; i++)
        int a = i;
        }");
var root = (CompilationUnitSyntax)tree.GetRoot();

IEnumerable<ForStatementSyntax> forStatementSyntaxs = root.DescendantNodes().OfType<ForStatementSyntax>();

ForStatementSyntax forStatementSyntax = forStatementSyntaxs.First();
ExpressionSyntax expressionSyntax = forStatementSyntax.Incrementors.First();
SyntaxTree-tree=CSharpSyntaxTree.ParseText(
@“使用系统;
使用System.Collections.Generic;
使用系统文本;
静态void Main(字符串[]参数)
{

对于(int i=0;i创建一个SyntaxRewriter,它是一个访问者,可用于将语法树中的节点替换为您创建的新节点。对于所有节点,还有一些方法可用于创建对其进行更改的新节点

在本例中,您希望使用已更改的条件和语句为StatementSyntax创建一个新的
节点。因此,您可以使用
WithCondition()
WithStatement()
方法分别进行更新。您可以手动创建新节点,也可以使用许多
SyntaxFactory
方法之一解析字符串

e、 g

创建了访问者后,您只需简单地使用它即可

var root = SyntaxFactory.ParseCompilationUnit(
@"using System;
using System.Collections.Generic;
using System.Text;

static void Main(string[] args)
{
    for(int i=0; i<10; i++)
        int a = i;
}");
var rewritten = new Rewriter().Visit(root);
var root=SyntaxFactory.ParseCompilationUnit(
@“使用系统;
使用System.Collections.Generic;
使用系统文本;
静态void Main(字符串[]参数)
{
对于(int i=0;i=0”)
).陈述(
SyntaxFactory.ParseStatement(@){
控制台写入线(i);
控制台写入线(i*2);
}
")
));

您的问题是什么?如何使用Roslyn“for循环”声明进行更改。此外,如何更改该循环包含的表达式。
class Rewriter : CSharpSyntaxRewriter
{
    public override SyntaxNode VisitForStatement(ForStatementSyntax node)
    {
        // update the current node with the new condition and statement
        return node.WithCondition(
            SyntaxFactory.ParseExpression("i>=0")
        ).WithStatement(
            SyntaxFactory.ParseStatement(@"{
              Console.WriteLine(i);
              Console.WriteLine(i*2);
            }")
        );
    }
}
var root = SyntaxFactory.ParseCompilationUnit(
@"using System;
using System.Collections.Generic;
using System.Text;

static void Main(string[] args)
{
    for(int i=0; i<10; i++)
        int a = i;
}");
var rewritten = new Rewriter().Visit(root);
var forStmt = root.DescendantNodes().OfType<ForStatementSyntax>().Single();
var rewritten = root.ReplaceNode(forStmt,
    forStmt.WithCondition(
        SyntaxFactory.ParseExpression("i>=0")
    ).WithStatement(
        SyntaxFactory.ParseStatement(@"    {
          Console.WriteLine(i);
          Console.WriteLine(i*2);
        }
      ")
    ));