如何:通过使用 CodeModel 对象创建 C# 类

CodeModel2 对象层次结构具有一套完整的用来自动生成代码的方法。 尽管您通常手动键入代码,但在一些情况下您可能想要自动化该进程的某些部分。 自动化使您可以:

  • 强制命名规则。

  • 强制文档标准。

  • 创建标准化的项目。

该过程假定您知道如何创建外接程序项目。 有关更多信息,请参见创建外接程序和向导

以下过程中的类将包含在新的源文件中。 稍后将方法添加到该类中。

备注

显示的对话框和菜单命令可能会与“帮助”中的描述不同,具体取决于您现用的设置或版本。这些过程是在“常规开发设置”处于活动状态时开发的。若要更改设置,请在“工具”菜单上选择“导入和导出设置”。有关更多信息,请参见 Visual Studio 设置

将新的源文件添加到该项目

  1. 使用 Visual C# 创建 Visual Studio 外接程序项目。

  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 Studio 集成开发环境 (IDE) 中打开一个 Visual C# 解决方案。

    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 类中的代码。 有关如何运行该示例的附加信息,请参见 如何:使用外接程序管理器控制外接程序

请参见

任务

如何:使用 CodeModel 对象分析 Visual Basic 代码

概念

Visual Basic 和 C# 应用程序的 CodeModel 对象概述

使用代码模型查找代码 (Visual Basic)

使用代码模型查找代码 (Visual C#)