是否有用于查询C#文件的LINQ查询提供程序?

时间:2014-01-15 18:31:40

标签: c# linq

是否存在用于查询C#文件的LINQ查询提供程序?

我有一个Winforms应用程序,用于帮助我生成代码以及补充Visual Studio对现有代码的编辑功能。我希望能够做的一件事是查询给定的类以查看方法是否存在。或查询类列表,或查询方法签名中具有特定type的类等。

此外,我希望能够在所述C#文件上运行通常的CRUD,但我意识到这可能超出了这个问题的范围。

解决!

感谢那些建议Roslyn的人,特别感谢下面Konrad Kokosa提供的代码示例,我能够得到我所需要的。

您需要做的第一件事是下载Roslyn DLL(我使用的是NuGet)。然后查询。下面是获取类中所有方法的按字母顺序排列的列表的另一个示例:

static List<string> GetMethodList(string filename, string className)
{
    var syntaxTree = SyntaxTree.ParseFile(filename);
    var root = syntaxTree.GetRoot();
    var @class = root.DescendantNodes().OfType<ClassDeclarationSyntax>().FirstOrDefault(md => md.Identifier.ValueText.Equals(className));

    return (List<string>) @class.DescendantNodes().OfType<MethodDeclarationSyntax>().ToList().OrderBy(m => m.Identifier.ValueText).Select(m => m.Identifier.ValueText);
}

2 个答案:

答案 0 :(得分:5)

我发现罗斯林非常直观。以下是在指定的类methodName内解析指定className的源文件的示例:

static void GetClassMethod(string filename, string className, string methodName)
{
    var syntaxTree = SyntaxTree.ParseFile(filename);
    var root = syntaxTree.GetRoot();
    var @class = root.DescendantNodes()
                      .OfType<ClassDeclarationSyntax>()
                      .Where(md => md.Identifier.ValueText.Equals(className))
                      .FirstOrDefault();
    var method = @class.DescendantNodes()
                      .OfType<MethodDeclarationSyntax>()
                      .Where(md => md.Identifier.ValueText.Equals(methodName))
                      .FirstOrDefault();
}

从这个例子中,您可以轻松地使用文件构建查询所有类。

答案 1 :(得分:4)

Microsoft正在开发一个名为Roslyn的项目,它允许您通过普通的.NET对象与C#代码进行交互:

http://msdn.microsoft.com/en-us/vstudio/roslyn.aspx

它尚未正式发布,而且老实说我不确定它是否会包含操作源文件(例如,向类中添加函数)等内容。

如果您正在处理已编译的代码,您可能会使用一些技巧,例如在运行时加载程序集,然后使用反射来查询它。

但是,我建议您查看已经可用于生成代码的工具,例如T4 Templates。可能有一种更好的方法来解决潜在的问题,而不是询问C#源文件。