초용 T4

개발 과정에서 우리는 싱크로율이 높은 코드를 많이 쓴다. 이런 코드를 쓰는 것은 규칙적이다. 예를 들어 우리는 데이터 테이블에 따라 실체 클래스를 생성한다.EF처럼 테이블에서 실체 클래스를 자동으로 생성한다. 만약에 우리가 응용 프로그램을 쓰고 데이터베이스를 읽고 하나를 생성한다.cs류 파일, 이것은 상대적으로 간단합니다. 만약에 VS에서 이 문제를 해결할 수 있다면 실행 프로그램 하나만 뛰어다니지 않아도 해피가 됩니다. 그러면 T4는 이 일을 하러 온 것입니다.T4는 Text Template Transformation Toolkit의 전체 명칭으로 더 이상 설명하지 않습니다. VS의 T4는 자세히 보십시오.https://msdn.microsoft.com/zh-cn/library/bb126445.aspx.
간단하게 보면 데이터의 표를 대응하는 실체 클래스로 만들고 프로젝트에 '실행할 때 텍스트 템플릿' 을 만듭니다. 확장자는 다음과 같습니다.tt,사실.tt의 코드가 표준 C# 코드인 경우tt는 디자인할 때 생성할 수 있습니다.cs 파일은 런타임에 생성할 수도 있습니다. 이 예는 디자인 타임에 생성되며 코드는 다음과 같습니다.

 
        ! 
 
";
	    xmlDoc.Save(Host.ResolveAssemblyReference("$(ProjectDir)")+@"\"+proName);
	 }
 
}
//       
public void WriteFile(string className,string content)
{
	 var writer = new System.IO.StreamWriter(Host.ResolveAssemblyReference("$(ProjectDir)")+@"\"+className + ".cs", false, Encoding.Default);
     writer.Write(content);
     writer.Flush();
     writer.Close();
 
}
//                
public  Dictionary BuildClass(string constr)
{
          
            using (var con = new System.Data.SqlClient.SqlConnection(constr))
            {
                var cmd = new System.Data.SqlClient.SqlCommand();
                cmd.CommandText = "select name from sys.tables WHERE name!='sysdiagrams' AND name!='__MigrationHistory'";
                cmd.Connection = con;
                con.Open();
                var dr = cmd.ExecuteReader();
                var dt = new DataTable();
                dt.Load(dr);
                dr.Close();
 
                var dic =new Dictionary();
                foreach (DataRow row in dt.Rows)
                {
                    cmd.CommandText = string.Format(@"select COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,IS_NULLABLE
 from information_schema.columns WHERE TABLE_NAME = '{0}'", row["name"].ToString());
                    var fielddr = cmd.ExecuteReader();
                    var fieldTable = new DataTable();
                    fieldTable.Load(fielddr);
                    fielddr.Close();
                    dic.Add(row["name"].ToString(), CreateClass(row["name"].ToString(), fieldTable));
                }
                return dic;
            }
 
        }
  
	
        public string CreateClass(string className, DataTable fields)
        {
            var csBuilder = new StringBuilder("\r
");             csBuilder.AppendLine(string.Format(@" public class {0}", className));             csBuilder.AppendLine(@" {");             foreach (DataRow row in fields.Rows)             {                 csBuilder.AppendLine(CreateProperty(row));             }             csBuilder.AppendLine(@"   }");             return csBuilder.ToString();         } // public string CreateProperty(DataRow row) {     var dic = new Dictionary();     dic.Add("nvarchar", "string");     dic.Add("varchar", "string");     dic.Add("char", "string");     dic.Add("text", "string");     dic.Add("int", "string");     dic.Add("money", "decimal");     dic.Add("float", "float");     dic.Add("bit", "bool");     var csBuilder = new StringBuilder();     csBuilder.AppendLine(string.Format(@"      public {0} {1}", dic[row["DATA_TYPE"].ToString().ToLower()], row["COLUMN_NAME"].ToString()));     csBuilder.AppendLine(@"      {");     csBuilder.AppendLine(string.Format(@"         get;"));     csBuilder.AppendLine(string.Format(@"         set;"));     csBuilder.AppendLine(@"      }");       return csBuilder.ToString(); }  #>

좋은 웹페이지 즐겨찾기