Поделиться через


Практическое руководство. Создание класса C# с помощью объекта CodeModel

Обновлен: Ноябрь 2007

В иерархии объекта CodeModel2 предусмотрен полный набор методов для автоматического создания кода. Хотя код, как правило, вводится вручную, в некоторых случаях можно автоматизировать часть этого процесса. Автоматизация позволяет выполнять следующие действия:

  • назначать соглашения об именах;

  • устанавливать стандарты документирования;

  • создавать стандартизированные проекты.

В данной процедуре предполагается, что вы умеете создавать проекты надстроек. Дополнительные сведения см. в разделе Создание надстроек и мастеров.

В приведенной далее процедуре класс будет содержаться в новом исходном файле. Затем к классу добавляется метод.

x6h10s6x.alert_note(ru-ru,VS.90).gifПримечание.

Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от текущих параметров или выпуска среды. Эти процедуры были разработаны с обычными параметрами разработки. Для изменения параметров выберите команду Импорт и экспорт параметров в меню Сервис. Дополнительные сведения см. в разделе Параметры Visual Studio.

Чтобы добавить в проект новый исходный файл

  1. Создайте проект надстройки Visual Studio, используя Visual C#.

  2. В меню Проект щелкните Добавить ссылку, перейдите на вкладку .NET выберите VSLangProj, VSLangProj2 и VSLangProj80, затем нажмите кнопку ОК.

  3. Добавьте следующий вызов метода к методу 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);
    }
    
  4. Добавьте метод AddAClass под методом OnConnection.

    public void AddAClass(DTE2 dte)
    {
    }
    
  5. Добавьте следующий код в метод 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#)