从.cs文件获取特定方法源代码(在运行时)

时间:2013-12-02 21:20:28

标签: c# parsing

1 - 我在光盘上有这个文件内容(cs文件,未编译):

    namespace Test
    {
        using System;
        public class TestClass 
        {
            public string SomeTestMethod(){
                return "test here";
            }
        }
    }

如何将运行时间输入变量方法:

public string SomeTestMethod(){
    return "test here";
}

例如:SourceCodeParser.GetMothod("path to file","SomeTestMethod");

2 - 访问者成员的内容是否可能?

   public string SomeMember {
        get {
            return "test here";
        }
    }

3 个答案:

答案 0 :(得分:13)

Roslyn就是您所需要的。您可以使用nuget轻松安装它。以下是获取方法体的工作代码:

string GetMethod(string filename, string methodName)
{
    var syntaxTree = SyntaxTree.ParseFile(filename);
    var root = syntaxTree.GetRoot();
    var method = root.DescendantNodes()
                     .OfType<MethodDeclarationSyntax>()
                     .Where(md => md.Identifier.ValueText.Equals(methodName))
                     .FirstOrDefault();
    return method.ToString();
}

获取属性getter的代码:

string GetPropertyGetter(string filename, string propertyName)
{
    var syntaxTree = SyntaxTree.ParseFile(filename);
    var root = syntaxTree.GetRoot();
    var property = root.DescendantNodes()
                       .OfType<PropertyDeclarationSyntax>()
                       .Where(md => md.Identifier.ValueText.Equals(propertyName))
                       .FirstOrDefault();
    var getter = property.AccessorList.Accessors.First(a => a.Kind == SyntaxKind.GetAccessorDeclaration);
    return getter.ToString();
}

答案 1 :(得分:1)

您需要一个工具,可以解析源代码,跟踪代码位置,并知道如何在源代码中查找方法(或变量,或任何您关心的名称)。有了它,找到感兴趣的线条非常容易。这样的工具不容易构建,因为完整语言的解析器不容易构建。查找功能也不容易;参数,名称空间,模板,继承都结合起来使现代语言的名称查找非常复杂。

程序转换(PT)工具(通常已经有这样的完整解析器)通常通过在内存中构建代表代码的AST来实现。然后,给定名称查找的规则,通过名称查找AST中的代码相对简单,并且可以使用这种工具的prettyprinter函数将命名实体打印到缓冲区/字符串/磁盘文件中,无论您希望它驻留在哪里

您不太可能找到PT作为可以直接从C#调用的子程序。您可以从程序中调用此类工具,并将其作为文本结果/文件结果/通过管道返回,无论您认为哪种方式最适合进程间通信。

如果要显示HTML页面中嵌入的方法文本,通常可以配置PT以生成包含prettyprinted实体文本的整个页面。 (有关此示例,请参阅我的bio的JavaSource浏览器。)

答案 2 :(得分:0)

.NET Reflection类不支持反编译为C#。您可以做的最好的事情是使用MMethodInfo.GetMethodBody()并在响应中调用MethodBody.GetILAsByteArray()。那个will give you the MSIL是.NET反射能给你的最好的。

要反编译为C#,您需要一个反编译器 - 其中至少有十几个合法选项。您需要调查符合您要求和预算的内容。

一个选项是Red Gate's .NET Reflector。尼克哈里森有long and thorough article on using .NET Reflector in an application to render source code as HTML