간단한 코드 생성 (T4 텍스트 템플릿을 운용)

한다고 쓴 이 글은 한동안 있다. 그러나 때문에 최근 각 방면의 스트레스 때문에 기분이 십이분 좋지 않다, 퇴근 후 왕왕 다 씻고 자.오늘 슬픔을 되씹다 마침내 이 일을 오래 끌면 짓.그래, 잔소리, 지금 좀 '간단한 코드 생성" .

먼저 보고 인터페이스?!

image

간략하다 이, 코드 생성기 말했다. 아마 의해 "한다.그래, 같은 집 안에 博友 따르면 이것은 단지 한 알이 조, 만약 당신이 원한다면 당신은 코드 생성기 '피드 볼 수 있다".

이렇게 실행 중인!

image

그림 하나 약도 이미 이 간단한 설명 코드 생성기 업무 과정.다음 소개 이 그림 전개 것이다:

1)데이터 리스트를 정보 읽는: 처음부터 데이터베이스 중 읽은 데이터 시트 정보 및 1개씩을 한다 T4 텍스트 템플릿을 제공하기 위해 데이터 엔진(EntityClassInfo);

2)장차 T4 텍스트 템플릿을 엔진 위해 데이터 (EntityClassInfo) 로서 매개 변수 전달 좀 T4 텍스트 템플릿을 엔진 (사실 T4 텍스트 템플릿을 엔진을 숙주, 상세한 것은 T4 텍스트 템플릿을 변환 과정),

3)T4 텍스트 템플릿을 엔진 읽기 템플릿,

4)T4 텍스트 템플릿을 엔진 선택한 텍스트 복귀, 응용 프로그램.

코드:

한 · 응용 프로그램 및 코드 중 배달 인자 타입

1)EntityClassInfo.cs

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;
namespace EntityInfo{ [Serializable] public class EntityClassInfo { public EntityClassInfo(DataTable dt) { this.ClassName = dt.TableName;
List<EntityClassPropertyInfo> ropertyListTemp = new List<EntityClassPropertyInfo>();
foreach (DataColumn dcol in dt.Columns) { ropertyListTemp.Add(new EntityClassPropertyInfo(dcol)); } this.RopertyList = ropertyListTemp;
List<EntityClassPropertyInfo> primaryKeyListTemp = new List<EntityClassPropertyInfo>(); List<EntityClassPropertyInfo> notPrimaryKeyListTemp = new List<EntityClassPropertyInfo>(ropertyListTemp); foreach (DataColumn dcol in dt.PrimaryKey) { primaryKeyListTemp.Add(new EntityClassPropertyInfo(dcol)); notPrimaryKeyListTemp.Remove(new EntityClassPropertyInfo(dcol)); } this.PrimaryKeyList = primaryKeyListTemp; this.NotPrimaryKeyList = notPrimaryKeyListTemp; } public string ClassName { get; private set; } public List<EntityClassPropertyInfo> RopertyList { get; private set; } public List<EntityClassPropertyInfo> PrimaryKeyList { get; private set; } public List<EntityClassPropertyInfo> NotPrimaryKeyList { get; private set; } }}

2)EntityClassPropertyInfo.cs

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;
namespace EntityInfo{ [Serializable] public class EntityClassPropertyInfo { public EntityClassPropertyInfo(DataColumn dcol) { this.PropertyName = dcol.ColumnName; this.PropertyType = dcol.DataType.ToString(); if (dcol.AllowDBNull && dcol.DataType.IsValueType) { this.PropertyType = this.PropertyType + "?"; } }
public string PropertyName { get; private set; }
public string PropertyType { get; private set; }
public override bool Equals(object obj) { EntityClassPropertyInfo temp = obj as EntityClassPropertyInfo; if (this.PropertyName == temp.PropertyName && this.PropertyType == temp.PropertyType) { return true; } return false; }
}}

둘째, 템플릿

1)개체 클래스 템플릿 생성: Entity.tt

<#@ template debug="false" hostspecific="false" language="C#" #><#@ output extension=".txt" #><#@ import namespace="EntityInfo" #><#@ parameter type="EntityInfo.EntityClassInfo" name="entity" #>using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;
/// <summary>/// <#= entity.ClassName#> 요약 설명/// </summary>public class <#= entity.ClassName#>{ public <#= entity.ClassName#>() { // // TODO: 여기에 추가 생성자 논리 // }<# foreach(EntityClassPropertyInfo property in entity.RopertyList) { #> private <#= property.PropertyType#> m_<#= property.PropertyName#>;<#; }#>
<# foreach(EntityClassPropertyInfo property in entity.RopertyList) { #> public <#= property.PropertyType#> <#= property.PropertyName#> { set { m_<#= property.PropertyName#> = value; } get { return m_<#= property.PropertyName#>; } }<#; }#>
}

2)DAL 층 템플릿 생성: DataAccess.tt

<#@ template debug="false" hostspecific="false" language="C#" #><#@ output extension=".txt" #><#@ import namespace="EntityInfo" #><#@ import namespace="System.Collections.Generic" #><#@ parameter type="EntityInfo.EntityClassInfo" name="entity" #>using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using MySql.Data.MySqlClient;using System.Collections.Generic;
/// <summary>/// <#= entity.ClassName#> 요약 설명/// </summary>public class <#= entity.ClassName#>DAL{ public <#= entity.ClassName#>DAL() {
}
#region 사유 방법
#region 따라 항목 종류 가져오는 중 MySqlParameter 배열 +MySqlParameter[] FromModel(<#= entity.ClassName#> model) private static MySqlParameter[] FromModel(<#= entity.ClassName#> model) { List<MySqlParameter> parameterList = new List<MySqlParameter>();<# foreach(EntityClassPropertyInfo property in entity.RopertyList) { #> parameterList.Add(new MySqlParameter("@<#= property.PropertyName#>", SQLHelper.ToDBValue(model.<#= property.PropertyName#>)));<#; }#> return parameterList.ToArray(); } #endregion

#region 는 dr 중 데이터 변환 개체 클래스 대상 + <#= entity.ClassName#> ToModel(DataRow dr) private static <#= entity.ClassName#> ToModel(DataRow dr) { <#= entity.ClassName#> model = new <#= entity.ClassName#>();<# foreach(EntityClassPropertyInfo property in entity.RopertyList) { #> model.<#= property.PropertyName#> = SQLHelper.FromDBValue(dr["<#= property.PropertyName#>"]) as <#= property.PropertyType#>;<#; }#> return model; } #endregion
#endregion
#region 증가하다 + int Insert(<#= entity.ClassName#> model) public static int Insert(<#= entity.ClassName#> model) { int result = -1; string sql = @"INSERT INTO FRNBaseInfo(<#= string.Join(",",GetSqlInsertInto()) #>) VALUES(<#= string.Join(",",GetSqlInsertValue()) #>);";
result = SQLHelper.ExecuteNonQuery(sql,FromModel(model));
return result; } #endregion
#region 삭제하다 + int DeleteById(<#= string.Join(",",GetSqlDelVariable()) #>) public static int DeleteById(<#= string.Join(",",GetSqlDelVariable()) #>) { int result = -1; string sql = @"DELETE FROM FRNBaseInfo WHERE <#= string.Join(" AND ",GetSqlWhereId()) #>;";
result = SQLHelper.ExecuteNonQuery(sql,<#= string.Join(",",GetSqlDelParameter()) #>);
return result; } #endregion
#region 고치다 + int Update(<#= entity.ClassName#> model) public static int Update(<#= entity.ClassName#> model) { int result = -1; string sql = @"UPDATE <#= entity.ClassName#> SET <#= string.Join(",",GetSqlUpdateSet()) #> WHERE <#= string.Join(" AND ",GetSqlWhereId()) #>";
result = SQLHelper.ExecuteNonQuery(sql, FromModel(model));
return result; } #endregion
#region 조사하다 + int GetCountAll() public static int GetCountAll() { int result = 0; string sql = @"SELECT Count(*) FROM <#= entity.ClassName#>;";
result = Convert.ToInt32(SQLHelper.ExecuteScalar(sql));
return result; } #endregion
#region 조사하다 + List<<#= entity.ClassName#>> GetBySql(string sql,params MySqlParameter[] parameters) public static List<<#= entity.ClassName#>> GetBySql(string sql,params MySqlParameter[] parameters) { List<<#= entity.ClassName#>> modelList = new List<<#= entity.ClassName#>>(); DataTable dt = SQLHelper.ExecuteDataTable(sql,parameters);
foreach (DataRow dr in dt.Rows) { modelList.Add(ToModel(dr)); } return modelList; } #endregion}
<#+ private string[] GetSqlInsertInto() { List<string> propertyNameList= new List<string>(); foreach(EntityClassPropertyInfo property in entity.RopertyList) { propertyNameList.Add(property.PropertyName); } return propertyNameList.ToArray(); } private string[] GetSqlInsertValue() { List<string> propertyNameList= new List<string>(); foreach(EntityClassPropertyInfo property in entity.RopertyList) { propertyNameList.Add("@" + property.PropertyName); } return propertyNameList.ToArray(); } private string[] GetSqlDelVariable() { List<string> propertyList= new List<string>(); foreach(EntityClassPropertyInfo property in entity.PrimaryKeyList) { propertyList.Add(property.PropertyType + " m_" + property.PropertyName); } return propertyList.ToArray(); } private string[] GetSqlDelParameter() { List<string> propertyList= new List<string>(); foreach(EntityClassPropertyInfo property in entity.PrimaryKeyList) { propertyList.Add("new MySqlParameter(@\"" + property.PropertyName + "\" ,m_" + property.PropertyName + ")"); } return propertyList.ToArray(); }
private string[] GetSqlUpdateSet() { List<string> propertyList= new List<string>(); foreach(EntityClassPropertyInfo property in entity.NotPrimaryKeyList) { propertyList.Add(property.PropertyName +"=@" + property.PropertyName); } return propertyList.ToArray(); } private string[] GetSqlWhereId() { List<string> propertyList= new List<string>(); foreach(EntityClassPropertyInfo property in entity.PrimaryKeyList) { propertyList.Add(property.PropertyName +"=@" + property.PropertyName); } return propertyList.ToArray(); }
#>

세, 코드 생성 네 걸음 걷다:

1)그 정보 데이터 시트 = EntityClassInfo:

DataTable dt = SQLHelper.ExecuteDataTable(SQLHelper.GetConnectionString(), string.Format("SELECT * FROM {0} LIMIT 0,0", cbbTableName.SelectedValue.ToString()));EntityClassInfo entityInfo = new EntityClassInfo(dt);

비고:

#region ExecuteTable방법 public static DataTable ExecuteDataTable(string connectionString,string sql, params MySqlParameter[] parameters) { using (MySqlConnection conn = new MySqlConnection(connectionString)) { using(MySqlCommand cmd = conn.CreateCommand()) { cmd.CommandText = sql; cmd.Parameters.AddRange(parameters); using (MySqlDataAdapter da = new MySqlDataAdapter(cmd)) { using (DataTable dt = new DataTable()) { da.Fill(dt); da.FillSchema(dt, SchemaType.Source); //에서 데이터 원본 중 검색 스키마 return dt; } } } } } #endregion

2)T4 텍스트 템플릿을 좀 전해 인삼:

CustomTextTemplatingEngineHost host = new CustomTextTemplatingEngineHost();host.Session = new TextTemplatingSession();host.Session.Add("entity", classInfo);

3)텍스트 서식 파일 읽기:

string input = File.ReadAllText(templatePath);string output = new Engine().ProcessTemplate(input, host);

4)다시 생성 텍스트:

string output = new Engine().ProcessTemplate(input, host);

원본 코드 다운로드 (VS2010 프로젝트): 간단한 코드 생성 (T4 텍스트 템플릿을 운용)

글쓴이 성훈 작성일 2014-06-29 21:47