Partilhar via


Como criar uma classe do C# usando o objeto CodeModel

A hierarquia de objetos de CodeModel2 tem métodos para gerar código automaticamente. Enquanto você, normalmente, digitaria o código manualmente, há situações onde você pode querer automatizar parte do processo. A automação permite que você:

  • Impõe convenções de nomenclatura.

  • Imponha os padrões de documentação.

  • Crie projetos padronizados.

Este procedimento presume que você saiba como criar um projeto do suplemento. Para obter mais informações, consulte Criando suplementos e assistentes.

A classe no procedimento a seguir será contida em um novo arquivo de origem. Posteriormente, um método é adicionado à classe.

Dica

Seu computador pode mostrar diferentes nomes ou localizações para alguns dos elementos de interface do usuário Visual Studio nas instruções a seguir.A edição do Visual Studio que você possui e as configurações que você usa determinam esses elementos.Para obter mais informações, consulte Personalizando configurações de desenvolvimento no Visual Studio.

Para adicionar um novo arquivo de origem ao projeto

  1. Crie um projeto de suplemento do Visual Studio usando o Visual C#.

  2. No menu Projeto, clique em Adicionar Referência, clique na guia .NET, selecione VSLangProj, VSLangProj2 e VSLangProj80 e clique em OK.

  3. Adicione a seguinte chamada de método ao método 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. Adicione o método de AddAClass diretamente abaixo do método de OnConnection.

    public void AddAClass(DTE2 dte)
    {
    }
    
  5. Adicione o seguinte código ao método de AddAClass para adicionar um arquivo de código novo e vazio ao projeto.

    O modelo CodeFile é instalado com Visual Studio e pode ser localizado usando o método GetProjectItemTemplate. O método usa dois parâmetros, os modelos de linguagem que você está procurando e o nome do arquivo do item de projeto resultante. O item de projeto é criado usando o método AddFromTemplate.

    O código, proj = soln.Projects.Item(1);, necessita que uma solução Visual C# seja aberta no ambiente de desenvolvimento integrado (IDE) Visual Studio antes da execução desse exemplo.

    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");
    

Para adicionar um namespace ao arquivo de origem

  • Adicione o seguinte código para adicionar um namespace no arquivo de origem.

    A propriedade FileCodeModel contém uma referência ao objeto de FileCodeModel2 que representa todos os elementos de código no arquivo. O objeto de FileCodeModel2 fornece vários métodos para adicionar elementos de código ao arquivo de origem. O método AddNamespace retorna um objeto CodeNamespace. Você usará essa referência de CodeNamespace para adicionar uma definição de classe para o código-fonte.

    FileCodeModel2 fcm = (FileCodeModel2)pi.FileCodeModel;
    CodeNamespace games;
    

Para adicionar a classe ao namespace

  • Use o método AddClass para adicionar uma classe Chess ao namespace Games . O método AddClass retorna uma referência a uma instância da CodeClass, que você pode usar para adicionar propriedades e métodos à classe.

    games = fcm.AddNamespace("Games", -1);
    CodeClass2 chess;
    

Para definir um método

  • Use o método AddFunction para adicionar um método Move à classe Chess. O primeiro argumento para o método especifica o nome da função criada. O segundo argumento determina o tipo de função criada, porque os operadores e construtores também são adicionados usando o método AddFunction. O terceiro argumento especifica o tipo de retorno da função e é substituído exatamente na assinatura do método.

    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);
    }
    

    O arquivo de origem gerado por esses procedimentos é mostrado abaixo.

    namespace Games
    {
        class Chess
        {
            int Move(bool IsOK)
            {
                return default(int);
            }
        }
    }
    

    O código do suplemento é mostrado abaixo.

    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
    

    Substitua o código na classe OnConnection pelo código de exemplo acima. Para obter informações adicionais sobre como executar este exemplo, consulte Como controlar suplementos usando o Gerenciador de Suplementos.

Consulte também

Tarefas

Como usar o objeto CodeModel para analisar código do Visual Basic

Conceitos

Visão geral do objeto CodeModel para aplicativos do Visual Basic e do C#

Descobrindo código usando o modelo de código (Visual Basic)

Descobrindo código usando o modelo de código (Visual C#)