是否存在用于查询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);
}
答案 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#源文件。