ToolsCodeTemplate使用

来源:http://www.cnblogs.com/xiangyisheng/archive/2016/12/21/6208637.html
-Advertisement-
Play Games

最近學習使用CodeSmith代碼生成器 CodeSmith 是一種語法類似於asp.net的基於模板的代碼生成器,程式可以自定義模板,從而減少重覆編碼的勞動量,提高效率。 作用:CodeSmith 是一種基於模板的代碼生成工具,它使用類似於ASP.NET的語法來生成任意類型的代碼或文本。與其他許多 ...


最近學習使用CodeSmith代碼生成器

CodeSmith 是一種語法類似於asp.net的基於模板的代碼生成器,程式可以自定義模板,從而減少重覆編碼的勞動量,提高效率。

作用:CodeSmith 是一種基於模板的代碼生成工具,它使用類似於ASP.NET的語法來生成任意類型的代碼或文本。與其他許多代碼生成工具不同,CodeSmith 不要求您訂閱特定的應用程式設計或體繫結構。使用 CodeSmith,可以生成包括簡單的強類型集合和完整應用程式在內的任何東西。

當您生成應用程式時,您經常需要重覆完成某些特定的任務,例如編寫數據訪問代碼或者生成自定義集合。CodeSmith 在這些時候特別有用,因為您可以編寫模板自動完成這些任務,從而不僅提高您的工作效率,而且能夠自動完成那些最為乏味的任務。CodeSmith 附帶了許多模板,包括對應於所有 .NET 集合類型的模板以及用於生成存儲過程的模板,但該工具的真正威力在於能夠創建自定義模板。

應用:CodeSmith 是一種語法類似於asp.net的基於模板的代碼生成器,程式可以自定義模板,從而減少重覆編碼的勞動量,提高效率。

安裝CodeSmith 2.6註冊後發現有兩個可運行程式CodeSmith Studio.exe和CodeSmith Explorer.exe

CodeSmith Studio.exe用來創建自定義模板

CodeSmith Explorer.exe用來導入模板並且生成代碼

打開 CodeSmith Studio.exe,新建一個C#模板。發現有如下類似與asp.net的標識符號

<% %>

<%= %>

<%@ %>

<script runat="template"> </script>

官方站點:http://www.codesmithtools.com/

下麵是使用CodeSmith常用的方法

  1 using System;
  2 using SchemaExplorer;
  3 using System.Data;
  4 using CodeSmith.Engine;
  5 using System.Text.RegularExpressions;
  6 
  7 /// <summary>
  8 /// CodeSmith公用方法類
  9 /// </summary>
 10 public class ToolsCodeTemplate:CodeTemplate
 11 {
 12     #region 獲取Molde類名稱
 13     /// <summary>
 14     /// 獲取Molde類名稱
 15     /// </summary>
 16     /// <param name="table"></param>
 17     /// <returns>表名稱(表名稱即為Model類名稱)</returns>
 18     public string GetModelClassName(TableSchema table)
 19     {
 20         string result;
 21         if ( table.ExtendedProperties.Contains("ModelName") )
 22         {
 23             result = (string)table.ExtendedProperties["ModelName"].Value;    
 24             return MakePascal(result);
 25         }
 26     
 27         if (table.Name.EndsWith("s"))
 28         {
 29             result = MakeSingle(table.Name);
 30         }
 31         else
 32         {
 33             result = table.Name;
 34         }
 35         
 36         return MakePascal(result);
 37     } 
 38     #endregion
 39     
 40     #region 獲取屬性名稱
 41     /// <summary>
 42     /// 獲取屬性名稱
 43     /// </summary>
 44     /// <param name="column"></param>
 45     /// <returns></returns>
 46     public string GetPropertyName(ColumnSchema column)
 47     {
 48         return MakePascal(GetNameFromDBFieldName(column));
 49     }
 50     #endregion
 51     
 52     #region 獲取從資料庫欄位得到的名稱
 53     /// <summary>
 54     /// 獲取從資料庫欄位得到的名稱
 55     /// </summary>
 56     /// <param name="column"></param>
 57     /// <returns></returns>
 58     public string GetNameFromDBFieldName(ColumnSchema column)
 59     {
 60         return column.Name;
 61     }
 62     #endregion
 63     
 64     #region 獲取屬性類型
 65     /// <summary>
 66     /// 獲取屬性類型
 67     /// </summary>
 68     /// <param name="column"></param>
 69     /// <returns>屬性類型</returns>
 70     public string GetPropertyType(ColumnSchema column)
 71     {
 72         return GetCSharpTypeFromDBFieldType(column);
 73     }
 74     #endregion
 75     
 76     #region 獲取主鍵名稱
 77     /// <summary>
 78     /// 獲取主鍵名稱
 79     /// </summary>
 80     /// <param name="TargetTable"></param>
 81     /// <returns>主鍵名稱</returns>
 82     public string GetPKName(TableSchema TargetTable)
 83     {
 84         if (TargetTable.PrimaryKey != null)
 85         {
 86             if (TargetTable.PrimaryKey.MemberColumns.Count == 1)
 87             {
 88                 return TargetTable.PrimaryKey.MemberColumns[0].Name;
 89             }
 90             else
 91             {
 92                 throw new Exception("This template will not work on primary keys with more than one member column.");
 93             }
 94         }
 95         else
 96         {
 97             throw new Exception("This template will only work on tables with a primary key.");
 98         }
 99     }
100     #endregion
101     
102     #region 獲取主鍵類型
103     /// <summary>
104     /// 獲取主鍵類型
105     /// </summary>
106     /// <param name="TargetTable"></param>
107     /// <returns>主鍵類型</returns>
108     public string GetPKType(TableSchema TargetTable)
109     {
110         if (TargetTable.PrimaryKey != null)
111         {
112             if (TargetTable.PrimaryKey.MemberColumns.Count == 1)
113             {
114                 return GetCSharpTypeFromDBFieldType(TargetTable.PrimaryKey.MemberColumns[0]);
115             }
116             else
117             {
118                 throw new ApplicationException("This template will not work on primary keys with more than one member column.");
119             }
120         }
121         else
122         {
123             throw new ApplicationException("This template will only work on MyTables with a primary key.");
124         }
125     }
126     #endregion
127     
128     #region 類型轉化
129     /// <summary>
130     /// 獲取資料庫類型轉化為C#類型
131     /// </summary>
132     /// <param name="column"></param>
133     /// <returns>C#類型的字元串</returns>
134     public string GetCSharpTypeFromDBFieldType(ColumnSchema column)
135     {
136         if (column.Name.EndsWith("TypeCode")) return column.Name;
137         string type;
138         switch (column.DataType)
139         {
140             case DbType.AnsiString: type= "string";break;
141             case DbType.AnsiStringFixedLength: type= "string";break;
142             case DbType.Binary: type= "byte[]";break;
143             case DbType.Boolean: type= "bool";break;
144             case DbType.Byte: type= "byte";break;
145             case DbType.Currency: type= "decimal";break;
146             case DbType.Date: type= "DateTime";break;
147             case DbType.DateTime: type= "DateTime";break;
148             case DbType.Decimal: type= "decimal";break;
149             case DbType.Double: type= "double";break;
150             case DbType.Guid: type= "Guid";break;
151             case DbType.Int16: type= "short";break;
152             case DbType.Int32: type= "int";break;
153             case DbType.Int64: type= "long";break;
154             case DbType.Object: type= "object";break;
155             case DbType.SByte: type= "sbyte";break;
156             case DbType.Single: type= "float";break;
157             case DbType.String: type= "string";break;
158             case DbType.StringFixedLength: type= "string";break;
159             case DbType.Time: type= "TimeSpan";break;
160             case DbType.UInt16: type= "ushort";break;
161             case DbType.UInt32: type= "uint";break;
162             case DbType.UInt64: type= "ulong";break;
163             case DbType.VarNumeric: type= "decimal";break;
164             default:
165             {
166                 type= "__UNKNOWN__" + column.NativeType;//未知
167                 break;
168             }
169         }
170         //是否為Null
171         if(column.AllowDBNull && column.SystemType.IsValueType)
172         {
173             type=type+"?";
174         }
175         return type;
176     }
177     /// <summary>
178     /// 獲取資料庫類型轉化為C#類型
179     /// </summary>
180     /// <param name="dbType">DbType的類型</param>
181     /// <returns>C#類型的字元串</returns>
182     public string GetDBTypeToCSharpType (System.Data.DbType dbType)
183     {
184         switch (dbType)
185         {
186             case DbType.AnsiString:return "string";
187             case DbType.AnsiStringFixedLength:return "string";
188             case DbType.Binary:return "byte[]";
189             case DbType.Boolean:return "bool";
190             case DbType.Byte:return "byte";
191             case DbType.Currency:return "decimal";
192             case DbType.Date:return "DateTime";
193             case DbType.DateTime:return "DateTime";
194             case DbType.DateTime2:return "DateTime";
195             case DbType.DateTimeOffset:return "DateTime";
196             case DbType.Decimal:return "decimal";
197             case DbType.Double:return "double";
198             case DbType.Guid:return "Guid";
199             case DbType.Int16:return "short";
200             case DbType.Int32:return "int";
201             case DbType.Int64:return "long";
202             case DbType.Object:return "object";
203             case DbType.SByte:return "sbyte";
204             case DbType.Single:return "float";
205             case DbType.String:return "string";
206             case DbType.StringFixedLength:return "string";
207             case DbType.Time:return "DateTime";
208             case DbType.UInt16:return "ushort";
209             case DbType.UInt32:return "uint";
210             case DbType.UInt64:return "ulong";
211             case DbType.VarNumeric:return "decimal";
212             case DbType.Xml:return "string";
213             default:return "object";
214         }
215     }
216     #endregion
217     
218     #region 駱駝命名法,帕斯卡命名法和匈牙利命名法
219     /// <summary>
220     /// 獲取首字母大寫的字元串
221     /// </summary>
222     /// <param name="value">字元串(例如:xiangyisheng)</param>
223     /// <returns>xiangyisheng => Xiangyisheng</returns>
224     public string MakePascal(string value)
225     {
226         return value.Substring(0, 1).ToUpper() + value.Substring(1);
227     }
228     /// <summary>
229     /// 獲取首字母小寫的字元串
230     /// </summary>
231     /// <param name="value">字元串(例如:Xiangyisheng)</param>
232     /// <returns>Xiangyisheng => xiangyisheng</returns>
233     public string MakeCamel(string value)
234     {
235         return value.Substring(0, 1).ToLower() + value.Substring(1);
236     }
237     /// <summary>
238     /// 獲取小寫的字元串
239     /// </summary>
240     /// <param name="value">字元串(例如:XiangYiSheng)</param>
241     /// <returns>XiangYiSheng => xiangyisheng</returns>
242     public string MakeSmall(string value)
243     {
244         return value.ToLower();
245     }    
246     /// <summary>
247     /// 獲取單數形式的字元串
248     /// </summary>
249     /// <param name="name">字元串(例如:Xiangyishengs)</param>
250     /// <returns>Xiangyishengs => Xiangyisheng</returns>
251     public string MakeSingle(string name)
252     {
253         Regex plural1 = new Regex("(?<keep>[^aeiou])ies$");
254         Regex plural2 = new Regex("(?<keep>[aeiou]y)s$");
255         Regex plural3 = new Regex("(?<keep>[sxzh])es$");
256         Regex plural4 = new Regex("(?<keep>[^sxzhyu])s$");
257     
258         if(plural1.IsMatch(name))
259             return plural1.Replace(name, "${keep}y");
260         else if(plural2.IsMatch(name))
261             return plural2.Replace(name, "${keep}");
262         else if(plural3.IsMatch(name))
263             return plural3.Replace(name, "${keep}");
264         else if(plural4.IsMatch(name))
265             return plural4.Replace(name, "${keep}");
266     
267         return name;
268     }
269     /// <summary>
270     /// 獲取複數形式的字元串
271     /// </summary>
272     /// <param name="name">字元串(例如:Xiangyisheng)</param>
273     /// <returns>Xiangyisheng => Xiangyishengs</returns>
274     public string MakePlural(string name)
275     {
276         Regex plural1 = new Regex("(?<keep>[^aeiou])y$");
277         Regex plural2 = new Regex("(?<keep>[aeiou]y)$");
278         Regex plural3 = new Regex("(?<keep>[sxzh])$");
279         Regex plural4 = new Regex("(?<keep>[^sxzhy])$");
280     
281         if(plural1.IsMatch(name))
282             return plural1.Replace(name, "${keep}ies");
283         else if(plural2.IsMatch(name))
284             return plural2.Replace(name, "${keep}s");
285         else if(plural3.IsMatch(name))
286             return plural3.Replace(name, "${keep}es");
287         else if(plural4.IsMatch(name))
288             return plural4.Replace(name, "${keep}s");
289     
290         return name;
291     }
292     #endregion
293     
294     #region 列印標題
295     /// <summary>
296     /// 列印標題
297     /// </summary>
298     public void PrintHeader()
299     {
300         Response.WriteLine("//============================================================");
301         Response.WriteLine("//http://www.cnblogs.com/xiangyisheng");
302         Response.WriteLine("//============================================================");
303         Response.WriteLine();
304     }
305     #endregion
306 }
ToolsCodeTemplate

下麵是我理解ToolsCodeTemplate測試例子

 1 <%-- 
 2 名稱:測試模板
 3 作者:長毛象
 4 描述:測試模板
 5 網址:http://www.cnblogs.com/xiangyisheng
 6 --%>
 7 <%@ CodeTemplate Language="C#" TargetLanguage="text" Src="ToolsCodeTemplate.cs" Inherits="ToolsCodeTemplate" Debug="False" Description="測試模板" ResponseEncoding="UTF-8" %>
 8 <%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Default="" Optional="False" Category="Table" Description="源表名" OnChanged="" Editor="" EditorBase="" Serializer="" %>
 9 <%@ Assembly Name="SchemaExplorer" %>
10 <%@ Import Namespace="SchemaExplorer" %>
11 <%@ Import Namespace="System.Data" %>
12 <% PrintHeader(); %>
13 
14 <%--獲取Molde類名稱 參數:表--%>
15 獲取Molde類名稱:<%= this.GetModelClassName(this.SourceTable) %>
16 
17 <%--獲取屬性名稱 參數:列--%>
18 <%foreach(ColumnSchema column in this.SourceTable.NonForeignKeyColumns){%>
19 獲取屬性名稱:<%=this.GetPropertyName(column)%>
20 <%}%>
21 
22 <%--獲取從資料庫欄位得到的名稱 參數:列--%>
23 <%foreach(ColumnSchema column in this.SourceTable.NonForeignKeyColumns){%>
24 獲取從資料庫欄位得到的名稱:<%=this.GetNameFromDBFieldName(column)%>
25 <%}%>
26 
27 <%--獲取屬性類型 參數:列--%>
28 <%foreach(ColumnSchema column in this.SourceTable.NonForeignKeyColumns){%>
29 獲取屬性類型:<%=this.GetPropertyType(column)%>
30 <%}%>
31 
32 <%--獲取主鍵名稱 參數:表--%>
33 獲取主鍵名稱:<%= this.GetPKName(this.SourceTable) %>
34 

              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • /****************************************** *效果圖(我不是給這游戲打廣告,只是隨手拿了一張圖而已) *說明:1.圖片是24位或32位bmp圖 2.屏幕是32位屏幕 3.不同的設備,可能設備文件不同 4.需要在root用戶下執行 ************* ...
  • 操作系統是電腦相關專業本科課程中最重要的課程! 操作系統是電腦相關專業本科課程中最重要的課程! 操作系統是電腦相關專業本科課程中最重要的課程! 重要的事情說三遍。大學讀了兩年半了,學習了3,4門硬體課程。我發現在我的大學中,本科硬體課程總體偏理論,旨在構建電腦硬體理論體系。之前彙編,組成原理 ...
  • 我遇到這個問題的時候查找網上都給出一堆高大上的解決辦法, 然而我的錯誤實際上是用戶名的問題, 很多人以為遠程用戶名就一定是鎖屏狀態下的登錄名, 其實不是,跟自己設置有關,所以首先應該檢查遠程用戶名是否輸入正確。 查看方式:被遠程電腦→win+Break→遠程設置→選擇用戶(在保證如下圖所示選擇的前提 ...
  • 通過以下方式之一定義方法,可以將參數發送至 Main 方法。 【備註】若要在 Windows 窗體應用程式中的 Main 方法中啟用命令行參數,必須手動修改 program.cs 中 Main 的簽名。 Windows 窗體設計器生成的代碼創建沒有輸入參數的 Main。 也可以使 用 Environ ...
  • Main方法是 C# 控制台應用程式或視窗應用程式的入口點。 (庫和服務不要求將 Main 方法作為入口點。) 應用程式啟動時,Main 方法是第一個調用的方法。 C# 程式中只能有一個入口點。 如果有多個類都包含 Main 方法,則必須使用 /main 編譯器選項編譯程式,以指定用作入口點的 Ma ...
  • 工具》選項》 確定後 如圖就可以多行顯示了。 ...
  • 這篇教程通過實現一個股票報價的小程式來講解如何使用SignalR進行伺服器端的推送,伺服器會模擬股票價格的波動,並把最新的股票價格推送給所有連接的客戶端。該文章參考的是[Server Broadcast with SignalR 2]這篇教程,很不錯的一篇教程,如果有興趣的話可以查看原文,今天記錄下... ...
  • 【HTML寫法標簽】【HTML字體段落標簽】【錨點】【有序無序列表】【表格】 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...