Generación Dinámica de Código II
En un post anterior comenté brevemente como se trabaja con la generación de código utilizando las librerías System.CodeDom y System.CodeDom.Compiler. En este post extenderemos un poco más los ejemplos visto y veremos cómo podemos construir otro tipo de estructuras utilizadas comúnmente en nuestros programas.
Declarar un atributo:
La declaración de atributos consta de tres parte principales, la visibilidad, el tipo de atributo y el nombre.
//Declaramos el atributo con el nombre y tipo
CodeMemberField atributo = new CodeMemberField(("String","MiAtrib");
//Indicamos la visibilidad
atributo.Attributes = MemberAttributes.Private;
//Comentarios para documentación
atributo.Comments.Add(new CodeCommentStatement("<summary>", true));
atributo.Comments.Add(new CodeCommentStatement("comentario", true));
atributo.Comments.Add(new CodeCommentStatement("</summary>", true));
La salida de este ejemplo será un fragmento de código como el siguiente:
/// <summary>
/// comentario
/// </summary>
public string MiAtrib;
Crear una propiedad:
Una propiedad como ya sabemos está compuesta de su visibilidad, el tipo, el nombre y opcionalmente un set y get asociados a un atributo.
CodeMemberProperty propiedad = new CodeMemberProperty();
// Indicamos el nombre de la propiedad.
propiedad.Name = "MiPropiedad";
// Indicamos el tipo de la propiedad.
propiedad.Type = new CodeTypeReference("String");
// Establecemos la visibilidad de la propiedad.
propiedad.Attributes = MemberAttributes.Public;
//Comentarios para documentación
propiedad.Comments.Add(new CodeCommentStatement("<summary>", true));
propiedad.Comments.Add(new CodeCommentStatement("comentario", true));
propiedad.Comments.Add(new CodeCommentStatement("</summary>", true));
// Creamos el return del get
CodeMethodReturnStatement cmReturn = new CodeMethodReturnStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), nombreAtributoAsociado));
//Añadimos el get
propiedad.GetStatements.Add(cmReturn);
// Creamos el contenido del set
CodeAssignStatement caSet = new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), nombreAtributoAsociado), new CodePropertySetValueReferenceExpression());
// Añadimos el set
propiedad.SetStatements.Add(caSet);
Nota: nombreAtributoAsociado sería el atributo que está asociado a la propiedad.
La salida de este ejemplo será un fragmento de código como el siguiente:
/// <summary>
/// comentario.
/// </summary>
public string Mipropiedad
{
get { return MiAtrib; }
set { MiAtrib = value; }
}
Crear una enumeración:
Para declarar una enumeración debemos especificar la visibilidad, tipo, nombre y los elementos de la misma.
//Declaramos el nodo para la enumeracion.
CodeTypeDeclaration enumerac = new CodeTypeDeclaration("MiEnum");
//Debemos indicar que el CodeTypeDeclaration va a ser tipo enumeración.
enumerac.IsEnum = true;
//Indicamos la visibilidad.
enumerac.Attributes = MemberAttributes.Public;
//Comentarios.
enumerac.Comments.Add(new CodeCommentStatement("<summary>", true));
enumerac.Comments.Add(new CodeCommentStatement("comentario", true));
enumerac.Comments.Add(new CodeCommentStatement("</summary>", true));
//Representa un campo.
CodeMemberField miembro;
//Vamos creando los valores de la enumeracion y los vamos añadiendo a la misma.
List<string> cadenasAtributos =new List<string>("elem1","elem2");
for (int i = 0; i < cadenasAtributos.Count; i++)
{
miembro = new CodeMemberField();
//Le damos un nombre al campo.
miembro.Name = cadenasAtributos[ i ];
//Añadimos el campo a la enumeración.
enumerac.Members.Add(miembro);
}
La salida de este ejemplo será un fragmento de código como el siguiente:
/// <summary>
/// comentario.
/// </summary>
public enum MiEnum {
elem1,
elem2,
}