如何:通过使用 CodeModel 对象创建 C# 类
CodeModel2 对象层次结构具有一套完整的用来自动生成代码的方法。 尽管您通常手动键入代码,但在一些情况下您可能想要自动化该进程的某些部分。 自动化使您可以:
强制命名规则。
强制文档标准。
创建标准化的项目。
该过程假定您知道如何创建外接程序项目。 有关更多信息,请参见创建外接程序和向导。
以下过程中的类将包含在新的源文件中。 稍后将方法添加到该类中。
备注
显示的对话框和菜单命令可能会与“帮助”中的描述不同,具体取决于您现用的设置或版本。这些过程是在“常规开发设置”处于活动状态时开发的。若要更改设置,请在“工具”菜单上选择“导入和导出设置”。有关更多信息,请参见 Visual Studio 设置。
将新的源文件添加到该项目
使用 Visual C# 创建 Visual Studio 外接程序项目。
在**“项目”菜单上单击“添加引用”,再单击“.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 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 代码