Кроме основных атрибутов и элементов проекта через экземпляр Project можно получить доступ к реальному коду исходных файлов проекта.
При помощи свойства CodeModel вы можете получить доступ ко всей линейке прокси-объектов, представляющих собой конструкции кода внутри проекта. Например, интерфейс CodeClass позволяет вам изучить и отредактировать код для данного класса в данном проекте.
Примечание
Поддержка объектов модели CodeModel для разных языков отличается. В документации MSDN для каждого типа CodeModel четко указана имеющаяся языковая поддержка данного элемента.
После получения ссылки на CodeModel из экземпляра Project вы можете получить доступ к его коллекции CodeElements (которая (естественно) является коллекцией объектов CodeElement). CodeElement — это просто обобщенное представление определенной кодовой структуры в проекте. Объект CodeElement является обобщенным, но у него есть свойство Kind. Оно используется для определения точного типа объекта кода, содержащегося внутри CodeElement.
Свойство CodeElement. Kind является перечислением (типа vsCMElement), которое устанавливает тип конструкции кода, скрытой в объекте CodeElement. Используя свойство Kind, вы можете сначала определить истинную природу элемента кода, а затем привести объект CodeElement к его строгому типу. Вот фрагмент кода на языке С#, который делает именно это:
if (element.Kind == vsCMElement.vsCMElementClass)
* CodeClass myClass = (CodeClass)element;
}
Для того чтобы лучше уловить иерархию модели кода, рассмотрим код на С#, представленный в листинге 11.1; это "ядро" решения, которое просто реализует пространство имен, класс внутри этого пространства и функцию в этом классе.
using System;
using System.Collections.Generic; using System.Text;
namespace MyNamespace {
class MyClass {
public string Sumlnt(int x, int y) {
return (x + y).ToString();
}
Если вы установите соответствие кода листинга 11.1с моделью объектов кода, то вы получите структуру, показанную на рис. 11.2.
Для того чтобы получить представление о полной глубине дерева модели кода, доступ к которому можно получить через коллекцию CodeEl^ments, загляните в табл. 11.5; в этой таблице показаны все возможные значения элемента vsCMElement, представляемый ими тип и краткое описание этого типа.