c# - 如何使用 Roslyn 将 C# 关键字替换为字符串替代项?

标签 c# code-generation abstract-syntax-tree roslyn

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

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

翻译成

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

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

最佳答案

我不知道这样做的效果如何,但您可以将每个 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);

哪个打印你想要的:

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

关于c# - 如何使用 Roslyn 将 C# 关键字替换为字符串替代项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26585869/

相关文章:

c# - 我在这里需要抽象类或接口(interface)吗(或者两者都不需要)?

java - 在 Eclipse 中从 XML 生成 Java 代码

java - GWT 编译器选项,用于使用 gwt maven 插件查看自定义生成器生成的文件

optimization - 编译器代码优化 : AST vs. IR

c# - 自动列出所有方法参数以将它们向前传递

c# - Razor 中 ViewModel 的模型名称

c# - 在 MvvmLight View 模型上调用 Cleanup() 是否取消注册所有消息

java - 在 Java 中生成 getters/setters(再次)

c++ - 如何区分 Clang AST 访问者中的函数定义和函数声明

python - 使用 Python 将 AST 形式的 Coq 术语转换为波兰表示法