Практическое руководство. Создание класса C# с помощью объекта CodeModel
Обновлен: Ноябрь 2007
В иерархии объекта CodeModel2 предусмотрен полный набор методов для автоматического создания кода. Хотя код, как правило, вводится вручную, в некоторых случаях можно автоматизировать часть этого процесса. Автоматизация позволяет выполнять следующие действия:
назначать соглашения об именах;
устанавливать стандарты документирования;
создавать стандартизированные проекты.
В данной процедуре предполагается, что вы умеете создавать проекты надстроек. Дополнительные сведения см. в разделе Создание надстроек и мастеров.
В приведенной далее процедуре класс будет содержаться в новом исходном файле. Затем к классу добавляется метод.
![]() |
---|
Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от текущих параметров или выпуска среды. Эти процедуры были разработаны с обычными параметрами разработки. Для изменения параметров выберите команду Импорт и экспорт параметров в меню Сервис. Дополнительные сведения см. в разделе Параметры Visual Studio. |
Чтобы добавить в проект новый исходный файл
Создайте проект надстройки Visual Studio, используя Visual C#.
В меню Проект щелкните Добавить ссылку, перейдите на вкладку .NET выберите VSLangProj, VSLangProj2 и VSLangProj80, затем нажмите кнопку ОК.
Добавьте следующий вызов метода к методу OnConnection.
public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom) { _applicationObject = (DTE2)application; _addInInstance = (AddIn)addInInst; // Call the AddClass method. AddAClass(_applicationObject); }
Добавьте метод AddAClass под методом OnConnection.
public void AddAClass(DTE2 dte) { }
Добавьте следующий код в метод AddAClass, чтобы добавить в проект новый пустой файл кода.
Шаблон CodeFile устанавливается с Visual Studio и может быть найден с помощью метода GetProjectItemTemplate. Этот метод использует два параметра: языковые шаблоны, для которых выполняется поиск, и имя файла элемента проекта. Элемент проекта создается с помощью метода AddFromTemplate.
Для кода proj = soln.Projects.Item(1); требуется открытое решение Visual C# в интегрированной среде разработки Visual Studio перед запуском этого примера.
Project proj; String csItemTemplatePath; Solution2 soln; soln = (Solution2)_applicationObject.Solution; // Open a C# solution in the Visual Studio IDE // before running this add-in. proj = soln.Projects.Item(1); ProjectItem pi; csItemTemplatePath = soln.GetProjectItemTemplate("CodeFile", "CSharp"); proj.ProjectItems.AddFromTemplate(csItemTemplatePath, "MyFile.cs"); pi = proj.ProjectItems.Item("MyFile.cs");
Чтобы добавить в исходный файл пространство имен
Добавьте следующий код, чтобы добавить в исходный файл пространство имен.
Свойство FileCodeModel содержит ссылку на объект FileCodeModel2, представляющий все элементы кода в файле. Объект FileCodeModel2 содержит различные методы добавления элементов кода в исходный файл. Метод AddNamespace возвращает объект CodeNamespace. Для добавления определения класса в исходный код будет использоваться данная ссылка CodeNamespace.
FileCodeModel2 fcm = (FileCodeModel2)pi.FileCodeModel; CodeNamespace games;
Чтобы добавить класс в пространство имен
Используйте метод AddClass для добавления класса Chess в пространство имен Games. Метод AddClass возвращает ссылку на экземпляр CodeClass, которой можно воспользоваться для добавления в класс свойств и методов.
games = fcm.AddNamespace("Games", -1); CodeClass2 chess;
Чтобы определить метод
Используйте метод AddFunction для добавления нового метода Move к классу Chess. Первый аргумент метода определяет имя создаваемой функции. Второй аргумент определяет тип создаваемой функции, поскольку операторы и конструкторы также добавляются с помощью метода AddFunction. Третий аргумент указывает возвращаемый тип функции и подставляется точно в подпись метода.
if (games != null) { // Add a class to the namespace. chess = (CodeClass2)games.AddClass("Chess", -1, null, null, vsCMAccess.vsCMAccessDefault); // Add a method with a parameter to the class. CodeFunction2 move; move = (CodeFunction2)chess.AddFunction("Move", vsCMFunction.vsCMFunctionFunction, "int", -1, vsCMAccess.vsCMAccessDefault, null); move.AddParameter("IsOK", "bool", -1); }
Далее показан исходный файл, созданный в результате этих процедур.
namespace Games { class Chess { int Move(bool IsOK) { return default(int); } } }
Ниже показан код надстройки.
public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom) { _applicationObject = (DTE2)application; _addInInstance = (AddIn)addInInst; // Call the AddClass method. AddAClass(_applicationObject); } public void AddAClass(DTE2 dte) { Project proj; String csItemTemplatePath; Solution2 soln; soln = (Solution2)_applicationObject.Solution; // Open a C# solution in the Visual Studio IDE // before running this add-in. proj = soln.Projects.Item(1); ProjectItem pi; csItemTemplatePath = soln.GetProjectItemTemplate("CodeFile", "CSharp"); proj.ProjectItems.AddFromTemplate(csItemTemplatePath, "MyFile.cs"); pi = proj.ProjectItems.Item("MyFile.cs"); FileCodeModel2 fcm = (FileCodeModel2)pi.FileCodeModel; CodeNamespace games; try { // Add a namespace. games = fcm.AddNamespace("Games", -1); CodeClass2 chess; if (games != null) { // Add a class to the namespace. chess = (CodeClass2)games.AddClass("Chess", -1, null, null, vsCMAccess.vsCMAccessDefault); // Add a method with a parameter to the class. CodeFunction2 move; move = (CodeFunction2)chess.AddFunction("Move", vsCMFunction.vsCMFunctionFunction, "int", -1, vsCMAccess.vsCMAccessDefault, null); move.AddParameter("IsOK", "bool", -1); } } catch (Exception ex) { MessageBox.Show("Failed to add a code model element, because " + ex.Message); } }
Public Sub OnConnection(ByVal application As Object, _ ByVal connectMode As ext_ConnectMode, ByVal addInInst As Object, _ ByRef custom As Array) Implements IDTExtensibility2.OnConnection _applicationObject = CType(application, DTE2) _addInInstance = CType(addInInst, AddIn) AddAClass(_applicationObject) End Sub Public Sub AddAClass(ByVal dte As DTE2) Dim proj As Project Dim csItemTemplatePath As String Dim soln As Solution2 soln = CType(_applicationObject.Solution, Solution2) ' Open a C# solution in the Visual Studio IDE before ' running this add-in. proj = soln.Projects.Item(1) Dim pi As ProjectItem csItemTemplatePath = soln.GetProjectItemTemplate("CodeFile", "CSharp") proj.ProjectItems.AddFromTemplate(csItemTemplatePath, "MyFile34.cs") pi = proj.ProjectItems.Item("MyFile34.cs") Dim fcm As FileCodeModel2 = CType(pi.FileCodeModel, FileCodeModel2) Dim games As CodeNamespace Try ' Add a namespace. games = fcm.AddNamespace("Games") Dim chess As CodeClass2 If Not games Is Nothing Then ' Add a class to the namespace. chess = CType(games.AddClass("Chess"), CodeClass2) ' Add a method with a parameter to the class. Dim move As CodeFunction2 move = CType(chess.AddFunction("Move", vsCMFunction.vsCMFunctionFunction, _ "int"), CodeFunction2) move.AddParameter("IsOK", "bool") End If Catch e As Exception MsgBox("Failed to add a code model element, because " & _ e.ToString()) End Try End Sub
Замените код в методе OnConnection приведенным выше кодом. Дополнительные сведения по запуску этого примера см. в разделе Практическое руководство. Управление надстройками с помощью диспетчера надстроек.
См. также
Задачи
Практическое руководство. Анализ кода Visual Basic с помощью объекта CodeModel
Основные понятия
Общие сведения о применении объекта CodeModel в приложениях Visual Basic и Visual C#
Практическое руководство. Поиск кода при помощи модели кода (Visual Basic)
Практическое руководство. Поиск кода при помощи модели кода (Visual C#)