Cómo: Crear una clase de C# con el objeto CodeModel
La jerarquía del objeto CodeModel2 incluye una completa serie de métodos destinados a generar código de forma automática.Aunque normalmente se escribe el código manualmente, existen situaciones en las que puede resultar conveniente automatizar algunos de los procesos.La automatización permite lo siguiente:
Obligar a usar las convenciones de nomenclatura.
Imponer las normas de documentación.
Crear proyectos normalizados.
En este procedimiento se supone que el usuario sabe cómo crear un proyecto de complemento.Para obtener más información, vea Crear complementos y asistentes.
La clase del procedimiento siguiente estará contenida en un nuevo archivo de código fuente.Después se agrega un método a la clase.
[!NOTA]
Los cuadros de diálogo y comandos de menú que se ven pueden diferir de los descritos en la Ayuda, en función de los valores de configuración o de edición activos.Estos procedimientos se han desarrollado con la Configuración de desarrollo general activa.Para cambiar la configuración, elija Importar y exportar configuraciones en el menú Herramientas.Para obtener más información, vea Valores de configuración de Visual Studio.
Para agregar un nuevo archivo de código fuente al proyecto
Cree un proyecto de complemento de Visual Studio mediante Visual C#.
En el menú Proyecto, haga clic en Agregar referencia, y luego en la ficha .NET, seleccione VSLangProj, VSLangProj2 y VSLangProj80 y, a continuación, haga clic en Aceptar.
Agregue la llamada siguiente al 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); }
Agregue el método AddAClass directamente después del método OnConnection.
public void AddAClass(DTE2 dte) { }
Agregue el código siguiente al método AddAClass para crear un nuevo archivo de código fuente vacío en el proyecto.
La plantilla CodeFile se instala con Visual Studio y se puede buscar con el método GetProjectItemTemplate.El método adopta dos parámetros: las plantillas de lenguaje que se están buscando y el nombre de archivo del elemento de proyecto resultante.El elemento de proyecto se crea con el método AddFromTemplate.
El código, proj = soln.Projects.Item(1);, necesita que una solución de Visual C# esté abierta en el entorno de desarrollo integrado (IDE) de Visual Studio antes de ejecutar este ejemplo.
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 agregar un espacio de nombres al archivo de código fuente
Agregue el código siguiente para crear un espacio de nombres en el archivo de código fuente.
La propiedad FileCodeModel contiene una referencia al objeto FileCodeModel2 que representa todos los elementos de código del archivo.A su vez, el objeto FileCodeModel2 proporciona varios métodos para agregar elementos de código al archivo de código fuente.El método AddNamespace devuelve un objeto CodeNamespace.Se utilizará esta referencia CodeNamespace para agregar una definición de clase al código fuente.
FileCodeModel2 fcm = (FileCodeModel2)pi.FileCodeModel; CodeNamespace games;
Para agregar la clase al espacio de nombres
Utilice el método AddClass para agregar una clase Chess al espacio de nombres Games .El método AddClass devolverá una referencia a una instancia de CodeClass, que se puede utilizar para agregar propiedades y métodos a la clase.
games = fcm.AddNamespace("Games", -1); CodeClass2 chess;
Para definir un método
Utilice el método AddFunction para agregar un método Move a la clase Chess.El primer argumento del método especifica el nombre de la función creada,y el segundo determina el tipo de función creada, ya que los operadores y constructores también se agregan mediante el método AddFunction.El tercer argumento especifica el tipo de valor devuelto de la función y se sustituye exactamente en la firma del 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); }
El archivo de código fuente producido por estos procedimientos se muestra a continuación.
namespace Games { class Chess { int Move(bool IsOK) { return default(int); } } }
El código del complemento se muestra a continuación.
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
Reemplace el código en la clase OnConnection por el código de ejemplo anterior.Para obtener información adicional sobre cómo ejecutar este ejemplo, vea Cómo: Controlar complementos con el Administrador de complementos.
Vea también
Tareas
Cómo: Utilizar el objeto CodeModel para analizar código de Visual Basic
Conceptos
Información general del objeto CodeModel en aplicaciones de Visual Basic y C#
Detectar código utilizando el modelo de código (Visual Basic)