亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#如何通過T4自動生成代碼詳解

2019-10-29 19:58:28
字體:
來源:轉載
供稿:網友

T4簡介

T4(Text Template Transformation Toolkit)在 Visual Studio 中,“T4 文本模板”是由一些文本塊和控制邏輯組成的混合模板,它可以生成文本文件。 在 Visual C# 或 Visual Basic 中,控制邏輯編寫為程序代碼的片段。生成的文件可以是任何類型的文本,例如網頁、資源文件或任何語言的程序源代碼。

T4 文本模板有兩種類型:

1、運行時模板

可在應用程序中執行運行時 T4 文本模板(“預處理過的”模板)以便生成文本字符串(通常作為其輸出的一部分)。

若要創建運行時模板,請向您的項目中添加“已預處理的文本模板”文件。

另外,您還可以添加純文本文件并將其“自定義工具”屬性設置為“TextTemplatingFilePreprocessor”。

2、設計時模板

在 Visual Studio 中執行設計時 T4 文本模板,以便定義應用程序的部分源代碼和其他資源。

通常,您可以使用讀取單個輸入文件或數據庫中的數據的多個模板,并生成一些 .cs、.vb 或其他源文件。

每個模板都生成一個文件。 在 Visual Studio 或 MSBuild 內執行它們。

若要創建設計時模板,請向您的項目中添加“文本模板”文件。 另外,您還可以添加純文本文件并將其“自定義工具”屬性設置為“TextTemplatingFileGenerator”。

通過T4模板生成代碼,運行時實現

關鍵代碼段:Host

using Microsoft.VisualStudio.TextTemplating;using System;using System.CodeDom.Compiler;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using System.Threading.Tasks;namespace CodeGenerate.EngineHost{ public class TextTemplatingEngineHost : ITextTemplatingEngineHost, ITextTemplatingSessionHost { public List<string> LocalDlls { get; set; } public List<string> Namespaces { get; set; } /// <summary> /// 模板文件 /// </summary> public string TemplateFile { get; set; } /// <summary> /// 文件擴展名 /// </summary> public string FileExtension { get; set; } /// <summary> /// 文件擴展名 /// </summary> public Encoding FileEncoding { get; set; } /// <summary> /// 錯誤信息 /// </summary> public CompilerErrorCollection Errors { get; set; } public IList<string> StandardAssemblyReferences {  get  {  LocalDlls.Add(typeof(System.Uri).Assembly.Location);  return LocalDlls;  } } public IList<string> StandardImports {  get  {  Namespaces.Add("System");  return Namespaces;  } } /// <summary> /// 參數傳遞 /// </summary> public ITextTemplatingSession Session { get; set; } public bool LoadIncludeText(string requestFileName, out string content, out string location) {  content = System.String.Empty;  location = System.String.Empty;  if (File.Exists(requestFileName))  {  content = File.ReadAllText(requestFileName);  return true;  }  else  {  return false;  } } public object GetHostOption(string optionName) {  object returnObject;  switch (optionName)  {  case "CacheAssemblies":   returnObject = true;   break;  default:   returnObject = null;   break;  }  return returnObject; } public string ResolveAssemblyReference(string assemblyReference) {  if (File.Exists(assemblyReference))  {  return assemblyReference;  }  string candidate = Path.Combine(Path.GetDirectoryName(this.TemplateFile), assemblyReference);  if (File.Exists(candidate))  {  return candidate;  }  return ""; } public Type ResolveDirectiveProcessor(string processorName) {  if (string.Compare(processorName, "XYZ", StringComparison.OrdinalIgnoreCase) == 0)  {  //return typeof();   }  throw new Exception("Directive Processor not found"); } public string ResolvePath(string fileName) {  if (fileName == null)  {  throw new ArgumentNullException("the file name cannot be null");  }  if (File.Exists(fileName))  {  return fileName;  }  string candidate = Path.Combine(Path.GetDirectoryName(this.TemplateFile), fileName);  if (File.Exists(candidate))  {  return candidate;  }  return fileName; } public string ResolveParameterValue(string directiveId, string processorName, string parameterName) {  if (directiveId == null)  {  throw new ArgumentNullException("the directiveId cannot be null");  }  if (processorName == null)  {  throw new ArgumentNullException("the processorName cannot be null");  }  if (parameterName == null)  {  throw new ArgumentNullException("the parameterName cannot be null");  }  return String.Empty; } public void SetFileExtension(string extension) {  FileExtension = extension; } public void SetOutputEncoding(System.Text.Encoding encoding, bool fromOutputDirective) {  FileEncoding = encoding; } public void LogErrors(CompilerErrorCollection errors) {  Errors = errors; } public AppDomain ProvideTemplatingAppDomain(string content) {  return AppDomain.CreateDomain("Generation App Domain"); } public ITextTemplatingSession CreateSession() {  return this.Session; } }}

Session

using Microsoft.VisualStudio.TextTemplating;using System;using System.Collections;using System.Collections.Generic;using System.Linq;using System.Runtime.Serialization;using System.Text;using System.Threading.Tasks;namespace CodeGenerate.EngineHost{ [Serializable] public class TextTemplatingSession : Dictionary<string, Object>, ITextTemplatingSession, ISerializable {  public Guid Id { get;private set; }  public TextTemplatingSession() : this(Guid.NewGuid())  {  }  public TextTemplatingSession(Guid id)  {   this.Id = id;  }  public override int GetHashCode()  {   return Id.GetHashCode();  }  public TextTemplatingSession(SerializationInfo info, StreamingContext context)   : base(info, context)  {   Id = (Guid)info.GetValue("Id", typeof(Guid));  }  void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)  {   base.GetObjectData(info, context);   info.AddValue("Id", Id);  }  public override bool Equals(object obj)  {   var o = obj as TextTemplatingSession;   return o != null && o.Equals(this);  }  public bool Equals(ITextTemplatingSession other)  {   return other != null && other.Id == this.Id;  }  public bool Equals(Guid other)  {   return other.Equals(Id);  } }}

入口

string templateFileName = "Template/test.tt";   TextTemplatingEngineHost host = new TextTemplatingEngineHost();   Engine engine = new Engine();   //引入本地dll   host.LocalDlls = new List<string>() { AppDomain.CurrentDomain.BaseDirectory.ToString() + "Params.dll" };   //引入命名空間   host.Namespaces = new List<string>() { "Params" };   //模板文件   host.TemplateFile = templateFileName;   //設置輸出文件的編碼格式   host.SetOutputEncoding(System.Text.Encoding.UTF8, false);   //通過Session將參數傳遞到模板   EngineHost.TextTemplatingSession keyValuePairs = new EngineHost.TextTemplatingSession();   testType t = new testType() { Name = "666666666666" };   keyValuePairs.Add("test", t);   host.Session = keyValuePairs;   //模板   string input = File.ReadAllText(templateFileName);   //執行代碼生成   string output = engine.ProcessTemplate(input, host);   //設置文件的輸出路徑和文件擴展名 ,,根據模板中的設置定義   string outputFileName = string.Concat(    AppDomain.CurrentDomain.BaseDirectory.ToString(), "Output/",    Path.GetFileNameWithoutExtension(templateFileName),    host.FileExtension);   //將生成的文件寫入到新位置   File.WriteAllText(outputFileName, output, host.FileEncoding);   if (host.Errors.HasErrors)   {    foreach (CompilerError error in host.Errors)    {     MessageBox.Show(error.ToString());    }   }

tt文件

<#@ template debug="false" hostspecific="false" language="C#" #><#@ import namespace="System.Collections.Generic" #><#@ assembly name="Params.dll" #><#@ import namespace="Params" #><#@ parameter type="Params.testType" name="test" #><#@ output extension=".cs" #><# if(test!=null&&test.Name!=null){#><#=test.Name #><# } #>

自定義參數

[Serializable] public class testType {  public string Name { get; set; } }

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲人在线视频| 国产欧美久久一区二区| 日韩免费看的电影电视剧大全| 亚洲天堂免费在线| 青草成人免费视频| 精品国产依人香蕉在线精品| 亚洲激情免费观看| 久久久久久91香蕉国产| 自拍偷拍亚洲一区| 亚洲美女在线看| 久久久国产精品免费| 最近2019年日本中文免费字幕| 欧美一区二区视频97| 亚洲视频第一页| 国产亚洲激情在线| 在线看欧美日韩| 日韩精品视频在线免费观看| 亚洲成人黄色网| 136fldh精品导航福利| 欧美性少妇18aaaa视频| 亚洲图片在线综合| 国产免费一区二区三区香蕉精| 精品久久中文字幕久久av| 热久久美女精品天天吊色| 国产精品免费网站| 日韩av片永久免费网站| 精品一区二区三区三区| 亚洲视频999| 中国china体内裑精亚洲片| 欧美亚洲成人网| 亚洲香蕉成人av网站在线观看| 97精品伊人久久久大香线蕉| 色悠悠国产精品| 一区二区三区久久精品| 日韩av网址在线| 91嫩草在线视频| 亚洲人成在线观看网站高清| 精品免费在线观看| 欧美精品情趣视频| 亚洲人成在线电影| 久久久www成人免费精品张筱雨| 这里只有视频精品| 成人h片在线播放免费网站| 亚洲最大成人免费视频| 最近中文字幕mv在线一区二区三区四区| 亚洲激情在线观看| 国产精品亚洲片夜色在线| 不卡av电影院| 精品免费在线观看| 日韩在线视频网站| 69精品小视频| 日韩欧亚中文在线| 97久久伊人激情网| www.xxxx欧美| 草民午夜欧美限制a级福利片| 亚洲欧美一区二区三区四区| 91在线观看免费高清| 久久精品亚洲国产| 国产精品视频网址| 国产精品入口免费视| 国产精品aaaa| 亚洲午夜精品久久久久久久久久久久| 日本久久久久久久久久久| 韩国国内大量揄拍精品视频| 国产亚洲日本欧美韩国| 国产精品国内视频| 一本色道久久88综合日韩精品| 久久久久久久久亚洲| 欧美日产国产成人免费图片| 久久亚洲欧美日韩精品专区| 亚洲精品国产综合区久久久久久久| 欧美激情影音先锋| 亚洲欧美另类人妖| 欧美性猛交xxx| 欧美黑人xxxⅹ高潮交| 日韩高清av一区二区三区| 夜夜嗨av一区二区三区四区| 久久久国产一区二区| 日韩在线播放视频| 亚洲美女黄色片| 亚洲激情电影中文字幕| 一区二区三区精品99久久| 亚洲精品成a人在线观看| 午夜精品久久久久久久久久久久| 亚洲夜晚福利在线观看| 国产精品va在线播放我和闺蜜| 亚洲国产中文字幕久久网| 欧美成人一区在线| 色噜噜狠狠色综合网图区| 欧美国产日韩一区二区| 国产精品久久久久高潮| 日本一区二区不卡| 日韩欧美中文免费| xxx一区二区| 不卡伊人av在线播放| 国产精品欧美激情在线播放| 九九视频这里只有精品| 欧美大全免费观看电视剧大泉洋| 欧美人交a欧美精品| 国产精品视频26uuu| 国产日韩欧美视频| 亚洲精品乱码久久久久久按摩观| 国产精品日韩欧美大师| 91干在线观看| 欧美性感美女h网站在线观看免费| 国产欧美va欧美va香蕉在线| 国产精品成人av性教育| 国产精品私拍pans大尺度在线| 国产成人精品电影久久久| 日韩欧美在线免费观看| 亚洲永久免费观看| 在线激情影院一区| 亚洲第一色中文字幕| 欧美做爰性生交视频| 国产大片精品免费永久看nba| 中文.日本.精品| 亚洲精品永久免费| 久久久久久久久久婷婷| 亚洲高清免费观看高清完整版| 精品国产拍在线观看| 久久精品久久精品亚洲人| 成人写真视频福利网| 久久91精品国产| 国产精品白嫩初高中害羞小美女| 中文字幕av一区二区三区谷原希美| 日韩欧美亚洲国产一区| 国产精品美女久久久免费| 欧美与黑人午夜性猛交久久久| 日本成人激情视频| 国产一区二区免费| 欧美激情第6页| 亚洲成人亚洲激情| 亚洲三级黄色在线观看| 欧美电影免费观看网站| 久久久国产精彩视频美女艺术照福利| 亚洲黄色www网站| 欧美电影在线观看完整版| 2019精品视频| 91色琪琪电影亚洲精品久久| 久久久国产精品视频| 亚洲人在线视频| 日韩av电影手机在线| 亚洲综合中文字幕在线观看| 国产精品久久久久久久午夜| 成人激情综合网| 欧美专区国产专区| 不卡av在线网站| 日本久久久a级免费| 亚洲一区二区三区成人在线视频精品| 精品呦交小u女在线| 欧美日韩亚洲91| 国产在线高清精品| 成人激情春色网| 中日韩美女免费视频网站在线观看| 欧美精品免费看| 日韩精品极品在线观看播放免费视频| 麻豆国产va免费精品高清在线| 国产日韩亚洲欧美| 91精品久久久久久久久久入口| 国产日韩欧美夫妻视频在线观看| 欧美日韩成人在线视频| 日韩精品视频免费专区在线播放| 国产成人欧美在线观看| 国产精品中文久久久久久久|