Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.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
如何使用Roslyn用字符串替换C#关键字?_C#_Code Generation_Abstract Syntax Tree_Roslyn - Fatal编程技术网

如何使用Roslyn用字符串替换C#关键字?

如何使用Roslyn用字符串替换C#关键字?,c#,code-generation,abstract-syntax-tree,roslyn,C#,Code Generation,Abstract Syntax Tree,Roslyn,我想使用Roslyn加载C#源代码并将其写入另一个文件,用替换词替换关键字。样本: for (int i=0; i<10; i++){} 用于(int i=0;i您需要考虑创建一个SyntaxWalker,它遍历整个树并将其复制到输出文件,但作为关键字标记的元素除外。我不知道这会有多好,但您可以用另一个ForKeyword标记替换每个ForKeyword标记,但这次您可以使用CSharpSyntaxRewriter: class KeywordRewriter : CSharpSynta

我想使用Roslyn加载C#源代码并将其写入另一个文件,用替换词替换关键字。样本:

for (int i=0; i<10; i++){}

用于(int i=0;i您需要考虑创建一个
SyntaxWalker
,它遍历整个树并将其复制到输出文件,但作为关键字标记的元素除外。

我不知道这会有多好,但您可以用另一个
ForKeyword
标记替换每个
ForKeyword
标记,但这次您可以使用
CSharpSyntaxRewriter

class KeywordRewriter : CSharpSyntaxRewriter
{
    public override SyntaxToken VisitToken(SyntaxToken token)
    {
        if (token.Kind() == SyntaxKind.ForKeyword)
        {
            return SyntaxFactory.Token(
                token.LeadingTrivia, SyntaxKind.ForKeyword, "foobar", "foobar",
                token.TrailingTrivia);
        }

        return token;
    }
}
使用此重写器,您可以编写如下代码:

string code = "for (int i=0; i<10; i++){}";

var statement = SyntaxFactory.ParseStatement(code);

var rewrittenStatement = new KeywordRewriter().Visit(statement);

Console.WriteLine(rewrittenStatement);

string code=“for(inti=0;i仅用于记录-下面的代码也起作用,但接受的答案要优雅得多

foreach (var t in tree.GetCompilationUnitRoot().DescendantTokens())
{

    if (t.HasLeadingTrivia)
    {
        file.Write(t.LeadingTrivia);
    }

    file.Write(t.IsKind(SyntaxKind.ForKeyword)? "foobar" : t.ToString());

    if (t.HasTrailingTrivia)
    {
        file.Write(t.TrailingTrivia);
    }

}

你们为什么要这样做?你们尝试过什么?原因:将用C#subset编写的程序翻译成具有不同语法的任意语言。我知道如何修改树,我不知道如何控制令牌表示输出。
foobar (int i=0; i<10; i++){}
foreach (var t in tree.GetCompilationUnitRoot().DescendantTokens())
{

    if (t.HasLeadingTrivia)
    {
        file.Write(t.LeadingTrivia);
    }

    file.Write(t.IsKind(SyntaxKind.ForKeyword)? "foobar" : t.ToString());

    if (t.HasTrailingTrivia)
    {
        file.Write(t.TrailingTrivia);
    }

}