0

我正在尝试更新现有的 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

4

1 回答 1

2

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

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

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

您可以将表示方法代码的 MethodDeclaration 添加到表示原始文件中某个类的 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);
    }
于 2011-03-24T15:30:32.093 回答