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

tom*_*ash 3 c# code-generation abstract-syntax-tree roslyn

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

for (int i=0; i<10; i++){}
Run Code Online (Sandbox Code Playgroud)

翻译成

foobar (int i=0; i<10; i++){}
Run Code Online (Sandbox Code Playgroud)

这种操作的语法可能是什么样的?

svi*_*ick 7

我不知道这有多好,但您可以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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

var statement = SyntaxFactory.ParseStatement(code);

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

Console.WriteLine(rewrittenStatement);
Run Code Online (Sandbox Code Playgroud)

打印出你想要的东西:

foobar (int i=0; i<10; i++){}
Run Code Online (Sandbox Code Playgroud)