技术开发 频道

VS.NET集成环境插件开发指南之操纵VS开发环境

说明:

上面的代码先从DTE对象(也即VS自动模型的根对象)获得当前正活动的文档对象

然后再根据文档对象获取和它关联的项目元素,这里的ProjectItem其实就是在解决方案资源管理器下面的项目文件夹对应的子项。可以是各种类型,如文件,文件夹等

再从项目元素获得关联的文件代码模型

根据文件代码模型获取其代码元素的集合CodeElementCollection,代码元素的父类为CodeElement,下面派生出许多的子类,代表具体的代码元素,分别有:

CodeNamespaceCodeClassCodeInterfaceCodeFunction

CodePropertyCodeVariableCodeDelegateCodeStructCodeEnum

代表着命名空间、类、接口、函数、属性、变量、委托、结构、枚举等类型的代码元素,某个CodeElement具体是何类型,可以根据CodeElement. vsCMElement枚举类型来判断,然后再显式转换成具体的子类即可

但是更进一步的代码元素,如函数体内的语句,好像还没有看到有方法检索。不过也可以利用一些其它的方法,比如CodeRush的程序集里面提供了一个StructuralParser程序集,用于C#的代码分析。如果谁有兴趣可以研究研究

 

l 根据具体类型检索代码元素(不再多做解释了):

private ArrayList getCodeElements(CodeElement baseElement) { ArrayList result = new ArrayList(); switch(baseElement.Kind) { case vsCMElement.vsCMElementNamespace: CodeNamespace cn = (CodeNamespace) baseElement; foreach(CodeElement element in cn.Members) { result.AddRange(getCodeElements(element)); } break; case vsCMElement.vsCMElementClass: CodeClass cc = (CodeClass) baseElement; foreach(CodeElement element in cc.Members) { result.AddRange(getCodeElements(element)); } break; case vsCMElement.vsCMElementInterface: CodeInterface ci = (CodeInterface) baseElement; foreach(CodeElement element in ci.Members) { result.AddRange(getCodeElements(element)); } break; case vsCMElement.vsCMElementFunction: result.Add(baseElement); break; case vsCMElement.vsCMElementProperty: { result.Add(baseElement); } break; case vsCMElement.vsCMElementEvent: { result.Add(baseElement); } break; case vsCMElement.vsCMElementDelegate: { result.Add(baseElement); } break; case vsCMElement.vsCMElementStruct: { result.Add(baseElement); CodeStruct cs = (CodeStruct) baseElement; foreach(CodeElement element in cs.Members) { result.AddRange(getCodeElements(element)); } } break; case vsCMElement.vsCMElementEnum: { result.Add(baseElement); } break; case vsCMElement.vsCMElementAttribute: result.Add(baseElement); break; case vsCMElement.vsCMElementUsingStmt: result.Add(baseElement); break; case vsCMElement.vsCMElementVariable: result.Add(baseElement); break; } return result; }

0
相关文章