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

时间:2011-03-24 14:02:44

标签: c# code-generation icsharpcode

我正在尝试更新现有的C#代码。使用ICSharpCode.NRefactory.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#代码?

1 个答案:

答案 0 :(得分:2)

您将方法添加为IMethod - IMethod只是将方法表示为DOM实体以及有关其签名的一些信息(没有任何代码) - 所以我看不出您将如何生成C#来自它的代码......

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

然而, CompilationUnit 是代码文件的抽象语法树,可以使用CSharpOutputVisitor和VBNetOutputVisitor类轻松地转换回C#/ VB.NET代码。

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

为了您的方便,我附加了一个PrettyPrint扩展方法,该方法在将INode转换为代码时非常有用:

    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);
    }