VS.NET集成环境插件开发指南之操纵VS开发环境
说明:
上面的代码先从DTE对象(也即VS自动模型的根对象)获得当前正活动的文档对象
然后再根据文档对象获取和它关联的项目元素,这里的ProjectItem其实就是在解决方案资源管理器下面的项目文件夹对应的子项。可以是各种类型,如文件,文件夹等
再从项目元素获得关联的文件代码模型
根据文件代码模型获取其代码元素的集合CodeElementCollection,代码元素的父类为CodeElement,下面派生出许多的子类,代表具体的代码元素,分别有:
CodeNamespace、CodeClass、CodeInterface、CodeFunction
CodeProperty、CodeVariable、CodeDelegate、CodeStruct、CodeEnum
代表着命名空间、类、接口、函数、属性、变量、委托、结构、枚举等类型的代码元素,某个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;
}
