Visual Studio扩展获取所有类和接口元数据 [英] Visual Studio Extension get all classes and interfaces metadata
本文介绍了Visual Studio扩展获取所有类和接口元数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我已经成功创建了Visual Studio Extension项目. 它的工作原理很好,也很整洁.我为解决方案做了一些活动.
I have successfully created the Visual Studio Extension project. It works nice and neat. I made some event for solutions.
MSDN和Internet中的手册很简短.我找不到我的问题的答案: 在安装此扩展包的解决方案中,如何检索与类和接口(名称空间,类名称,基本类型等)相关的所有元数据?
The manuals in MSDN and the Internet are brief. And I cannot find an answer to my question: How can I retrieve all metadata related to the class and interfaces (namespaces, class names, base types, etc.) in the solution where this Extension Package is installed?
推荐答案
此代码是关于名称空间的,但是您可以轻松地对其进行转换以从CodeModel中获取所有内容:
This code is about namespace, but you can easily transform it to take everything from CodeModel:
public class Metadata
{
public List<Namespace> ExtractNamespaces()
{
var namespaces = new List<Namespace>();
var service = (DTE)Package.GetGlobalService(typeof(SDTE));
var projects = service.Solution.Projects;
foreach (Project project in projects)
{
var projectItems = GetProjectItemsRecursively(project.ProjectItems);
foreach (ProjectItem item in projectItems.Where(i => i.FileCodeModel != null))
{
foreach (CodeElement elem in item.FileCodeModel.CodeElements)
{
namespaces.AddRange(GetNamespacesRecursive(elem).Select(n=>new Namespace(n)));
}
}
}
return namespaces.Distinct().OrderBy(n=>n.ToString()).ToList();
}
private static List<string> GetNamespacesRecursive(CodeElement elem)
{
var namespaces = new List<string>();
if (IsNamespaceable(elem.Kind) && IsEmptyNamespace(elem))
{
namespaces.Add(string.Empty);
}
if (elem.Kind == vsCMElement.vsCMElementNamespace && !namespaces.Contains(elem.FullName))
{
namespaces.Add(elem.FullName);
if (elem.Children != null)
{
foreach (CodeElement codeElement in elem.Children)
{
var ns = GetNamespacesRecursive(codeElement);
if (ns.Count > 0)
namespaces.AddRange(ns);
}
}
}
return namespaces;
}
private static bool IsEmptyNamespace(CodeElement elem)
{
return elem.FullName.IndexOf('.') < 0;
}
private static bool IsNamespaceable(vsCMElement kind)
{
return (kind == vsCMElement.vsCMElementClass
|| kind == vsCMElement.vsCMElementEnum
|| kind == vsCMElement.vsCMElementInterface
|| kind == vsCMElement.vsCMElementStruct);
}
private static List<ProjectItem> GetProjectItemsRecursively(ProjectItems items)
{
var ret = new List<EnvDTE.ProjectItem>();
if (items == null) return ret;
foreach (ProjectItem item in items)
{
ret.Add(item);
ret.AddRange(GetProjectItemsRecursively(item.ProjectItems));
}
return ret;
}
}
这篇关于Visual Studio扩展获取所有类和接口元数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文