C# 如何从ICompilationUnit(ICSharpCode)生成C代码

C# 如何从ICompilationUnit(ICSharpCode)生成C代码,c#,code-generation,icsharpcode,C#,Code Generation,Icsharpcode,我正在尝试更新现有的C#代码。使用ICSharpCode.nreport.IParser解析代码。我的系统广泛使用ICompilationUnit来探索现有代码 现在,我想向现有文件添加一个方法,并将其作为C代码保存回磁盘。到目前为止,我已经: CompilationUnit compilationUnit = GetCompilationUnit(); var visitor = new NRefactoryASTConvertVisitor(new ParseProjectContent()

我正在尝试更新现有的C#代码。使用
ICSharpCode.nreport.IParser
解析代码。我的系统广泛使用ICompilationUnit来探索现有代码

现在,我想向现有文件添加一个方法,并将其作为C代码保存回磁盘。到目前为止,我已经:

CompilationUnit compilationUnit = GetCompilationUnit();
var visitor = new NRefactoryASTConvertVisitor(new ParseProjectContent());
compilationUnit.AcceptVisitor(visitor, null);
IMethod method = //GetMethod from otherplace
visitor.Cu.Classes[0].Methods.Add(method);
// How the updated visitor.Cu be transformed to C# code

我想做的是从
visitor.Cu
生成C代码。有没有一种方法可以从ICompilationUnit生成C代码?

您正在将该方法添加为一个IMethod-一个IMethod只是将一个方法表示为一个DOM实体以及一些关于其签名的信息(没有任何代码)-所以我不知道如何从中生成C代码

(除非您的意思是仅为方法的签名生成代码?在这种情况下,您应该查看Dom->AST转换的类ICSharpCode.SHARPDEVEL.Dom.Refactoring.CodeGenerator,特别是
ConvertMember(IMethod m,ClassFinder targetContext)
方法)

但是,编译单元是代码文件的抽象语法树,可以使用CSharpOutputVisitor和VBNetOutputVisitor类轻松地转换回C#/VB.NET代码

您可以将表示方法代码的MethodDeclaration添加到表示原始文件中某个类的TypeDefinition中,然后使用前面提到的输出访问者生成插入新方法的代码

为了方便起见,我附加了一个PrettyPrint扩展方法,在将索引节点转换为代码时非常有用:

    public static string PrettyPrint(this INode code, LanguageProperties language)
    {
        if (code == null) return string.Empty;
        IOutputAstVisitor csOutVisitor = CreateCodePrinter(language);
        code.AcceptVisitor(csOutVisitor, null);
        return csOutVisitor.Text;
    }

    private static IOutputAstVisitor CreateCodePrinter(LanguageProperties language)
    {
        if (language == LanguageProperties.CSharp) return new CSharpOutputVisitor();
        if (language == LanguageProperties.VBNet) return new VBNetOutputVisitor();
        throw new NotSupportedException();
    }

    public static string ToCSharpCode(this INode code)
    {
        return code.PrettyPrint(LanguageProperties.CSharp);
    }