2010-04-14 14 views

Respuesta

10

Probablemente sea mucho más fácil usar plantillas T4. Here is a really good article on getting started

Mi ejemplo a continuación usa una conexión SQL directa, pero como puede ver, puede incluir cualquier código y generar el resultado que desee en un archivo cs compilado en su proyecto. Puede reemplazar la sintaxis de ADO a continuación con una enumeración sobre una colección de objetos recuperados a través de su modelo de Entituy Framework y publicarla en consecuencia.

Cree un archivo con la extensión .tt en el directorio donde desea que se genere el archivo de enumeración. Si nombra el archivo XXXXX.tt, se generará un archivo llamado XXXXX.cs, así que nombre el archivo tt de manera apropiada.

Pruebe algo en esta línea. Es posible que necesite experimentar un poco con la sintaxis y la salida, pero no voy a escribirlo todo para usted o no aprenderá nada :)

Solo tenga en cuenta que esta llamada a la base de datos se realizará cada vez que edite el archivo tt.

<#@ template language="C#" hostspecific="True" debug="True" #> 
<#@ output extension="cs" #> 
<#@ assembly name="System.Data" #> 
<#@ import namespace="System.Data" #> 
<#@ import namespace="System.Data.SqlClient" #> 
<# 
    SqlConnection sqlConn = new SqlConnection(@"Data Source=XXXX;Initial Catalog=XXXX; Integrated Security=True"); 
    sqlConn.Open(); 
#> 
namespace AppropriateNamespace 
{ 
public enum YourEnumName 
{ 
    <# 
    string sql = string.Format("SELECT Id, Name FROM YourTable ORDER BY Id"); 
    SqlCommand sqlComm = new SqlCommand(sql, sqlConn); 
    IDataReader reader = sqlComm.ExecuteReader(); 

    System.Text.StringBuilder sb = new System.Text.StringBuilder(); 
    while (reader.Read()) 
    { 
     sb.Append(FixName(reader["Name"].ToString()) + " = " + reader["Id"] + "," + Environment.NewLine + "\t\t"); 
    } 
    reader.Close(); 
    sqlComm.Dispose(); 
    #> 
<#= sb.ToString() #> 
    } 
} 

Intente mejorar esto. En lugar de escribir en StringBuilder, muestra los resultados de cada lector. Lee() directamente en el resultado. Además, he incluido un método FixName que aún no existe, pero es posible que lo necesite para eliminar espacios o caracteres ilegales.

+0

No conozco la plantilla T4 de wat .. –

+0

Actualmente estoy buscando un enlace útil –

+0

De acuerdo ... Gracias ... –

7

plantilla de Daniel es agradable y todo, pero me he puesto un poco más de esfuerzo en such a template lo que hace todo esto:

  • genera valores de enumeración con valores enteros explícitas;
  • utiliza la convención de nomenclatura del espacio de nombres de Visual Studio para que las enumeraciones generadas tengan el espacio de nombres predeterminado del proyecto con cualquier subcarpeta agregada (como cualquier archivo de código en Visual Studio);
  • agrega la documentación XML de enumeración completa mediante el uso de valores de columna de la tabla de descripción adicional; si no los tienes, no te preocupes;
  • nombra correctamente el archivo generado y agrega un atributo adicional en el código para que enum no se analice mediante el análisis de código;
  • los valores de la tabla de búsqueda de palabras múltiples se concatenan correctamente a los equivalentes pascal-casados ​​(es decir, valor de palabra múltiple se convierte en MultiWordValue);
  • los valores de enumeración siempre comienzan con una letra;
  • todos los valores de enumeración consisten en solo letras y números, todo lo demás se corta;

De todos modos. Todo está muy bien documentado en this blog post.

+2

Excelente. Buen seguimiento –

Cuestiones relacionadas