1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Reflection;
  10. using Microsoft.CSharp;
  11. using System.CodeDom.Compiler;
  12. using System.Web.Razor;
  13. using System.IO;
  14. namespace lxw_Compiler_RazorEngine
  15. {
  16. public partial class frmMain : Form
  17. {
  18. public frmMain()
  19. {
  20. InitializeComponent();
  21. }
  22. private void btnGenerate_Click(object sender, EventArgs e)
  23. {
  24. string TemplateString = txtTemplate.Text;
  25. Type ModelType = typeof(SampleModel);
  26. string TemplateName = "T" + Guid.NewGuid().ToString("N") + "Template";
  27. CSharpCodeProvider CodePrivoder = new CSharpCodeProvider();
  28. ICodeCompiler objICodeCompiler = CodePrivoder.CreateCompiler();
  29. var @params = new CompilerParameters();
  30. foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
  31. {
  32. if (assembly.ManifestModule.Name != "<In Memory Module>")
  33. @params.ReferencedAssemblies.Add(assembly.Location);
  34. }
  35. @params.GenerateInMemory = true;
  36. @params.IncludeDebugInformation = false;
  37. @params.GenerateExecutable = false;
  38. @params.CompilerOptions = "/target:library /optimize";
  39. var host = new RazorEngineHost(new CSharpRazorCodeLanguage());
  40. host.DefaultBaseClass = string.Format("lxw_Compiler_RazorEngine.RazorTemplateBase<{0}>", ModelType.FullName);
  41. host.DefaultNamespace = "lxw_Compiler_RazorEngine";
  42. host.DefaultClassName = TemplateName;
  43. host.NamespaceImports.Add("System");
  44. GeneratorResults razorResult = null;
  45. using (TextReader reader = new StringReader(TemplateString))
  46. {
  47. razorResult = new RazorTemplateEngine(host).GenerateCode(reader);
  48. }
  49. var builder = new StringBuilder();
  50. var codeProvider = new CSharpCodeProvider();
  51. using (var writer = new StringWriter(builder))
  52. {
  53. codeProvider.GenerateCodeFromCompileUnit(razorResult.GeneratedCode, writer, new CodeGeneratorOptions());
  54. }
  55. var result = codeProvider.CompileAssemblyFromSource(@params, new[] { builder.ToString() });
  56. if (result.Errors.HasErrors)
  57. {
  58. StringBuilder sbErrs = new StringBuilder(builder.ToString() + System.Environment.NewLine);
  59. sbErrs.Append("-----------代码中存在语法错误!-----------" + System.Environment.NewLine);
  60. foreach (CompilerError err in result.Errors)
  61. {
  62. sbErrs.AppendFormat("{0},{1}" + System.Environment.NewLine, err.ErrorNumber, err.ErrorText);
  63. }
  64. MessageBox.Show(sbErrs.ToString());
  65. return;
  66. }
  67. SampleModel sampleModel = new SampleModel();
  68. sampleModel.Prop1 = "lxw01";
  69. sampleModel.Prop2 = "lxw02";
  70. sampleModel.Prop3 = new List<string> { "lxw03-1", "lxw03-2", "lxw03-3" };
  71. var template = (RazorTemplateBase<SampleModel>)result.CompiledAssembly.CreateInstance("lxw_Compiler_RazorEngine." + TemplateName);
  72. template.Model = sampleModel;
  73. template.Execute();
  74. var output = template.Buffer.ToString();
  75. template.Buffer.Clear();
  76. txtResult.Text = output;
  77. }
  78. private void frmMain_Load(object sender, EventArgs e)
  79. {
  80. }
  81. }
  82. public class SampleModel
  83. {
  84. public string Prop1 { get; set; }
  85. public string Prop2 { get; set; }
  86. public List<string> Prop3 { get; set; }
  87. }
  88. public abstract class RazorTemplateBase<T>
  89. {
  90. public T Model { get; set; }
  91. public StringBuilder Buffer { get; set; }
  92. protected RazorTemplateBase()
  93. {
  94. Buffer = new StringBuilder();
  95. }
  96. public abstract void Execute();
  97. public virtual void Write(object value)
  98. {
  99. WriteLiteral(value);
  100. }
  101. public virtual void WriteLiteral(object value)
  102. {
  103. Buffer.Append(value);
  104. }
  105. }
  106. }

附件下载

使用Razor模板动态生成代码的更多相关文章

  1. 基于ABP做一个简单的系统——实战篇:4.基于富文本编辑器,Razor模板引擎生成内容并导出Word 填坑记录

    起因 需求是这样的,有一种协议需要生成,协议的模板是可配置的,在生成过程中,模板中的内容可以根据约定的标记进行替换(就像mvc的razor模板一样).生成后的内容还需要导出成word或pdf. 常见的 ...

  2. Emit动态生成代码

    Emit动态生成代码 引用:秒懂C#通过Emit动态生成代码 首先需要声明一个程序集名称, // specify a new assembly name var assemblyName = new ...

  3. 秒懂C#通过Emit动态生成代码 C#使用Emit构造拦截器动态代理类

    秒懂C#通过Emit动态生成代码   首先需要声明一个程序集名称, 1 // specify a new assembly name 2 var assemblyName = new Assembly ...

  4. 【转】- 使用T4模板批量生成代码

    前言 之前在 “使用T4模板生成代码 - 初探” 文章简单的使用了T4模板的生成功能,但对于一个模板生成多个实例文件,如何实现这个方式呢?无意发现一个解决方案 “MultipleOutputHelpe ...

  5. 秒懂C#通过Emit动态生成代码

    首先需要声明一个程序集名称, 1 // specify a new assembly name 2 var assemblyName = new AssemblyName("Kitty&qu ...

  6. [小tips]使用vscode,根据vue模板文件生成代码

    本着苍蝇虽小也是肉的精神...... 目标: 我们希望每次新建.vue文件后,VSCODE能够根据配置,自动生成我们想要的内容. 方法: 打开VSCODE编辑器,依次选择"文件 -> ...

  7. T4模板批量生成代码

    大家通过比对下,就应该知道怎么玩. T4代码 <#@ template debug="false" hostspecific="true" languag ...

  8. 使用T4模板动态生成邮件内容并储存到任意位置

    一.基础概念介绍 T4模板是扩展名为 .tt 的文本文件. 他分为设计时模板 和运行时模板.主要区别在于在vs中右键点击文件,打开“属性”,在“自定义工具”一栏中的值分别如下: 设计时模板: Text ...

  9. T4模板批量生成代码文件

    <#@ template debug="false" hostspecific="true" language="C#" #> ...

  10. 使用T4模板动态生成NPoco实体类

    这是一个妥妥的NPoco类,这是我们在工作开发中,手动去写这个实体类,属实非常心累,字段少无所谓一次两次,数量多了,字段多了,就心态裂开

随机推荐

  1. OCR 01: EasyOCR

    Catalog OCR 01: EasyOCR OCR 02: Tesseract-OCR OCR 03: PaddleOCR Related Links Official site with onl ...

  2. 【Unity3D】GUI控件

    1 前言 ​ Unity 3D 提供了 GUI.NGUI.UGUI 等图形系统,以增强玩家与游戏的交互性.GUI 在编译时不能可视化,在运行时才能可视化.GUI 代码需要在 OnGUI 函数中调用才能 ...

  3. HTTP协议发展历程

    HTTP协议发展历程 HTTP超文本传输协议是一个用于传输超文本文档的应用层协议,它是为Web浏览器与Web服务器之间的通信而设计的,HTTP协议到目前为止全部的版本可以分为HTTP 0.9.HTTP ...

  4. MySQL案例-并行复制乱序提交引起的同步异常

    现象描述 Slave在开启并行复制后, 默认会乱序提交事务, 可能会引起同步中断; Slave端表现为同步的SQL线程抛出异常, 为主键重复, 修改的数据行不存在等; GTID信息类似于: 9a2a5 ...

  5. Uniapp+Nodejs实现外卖App项目1-项目介绍

    项目介绍 本项目采用uniapp和nodejs(数据接口).mongodb等技术实现了一个类似美团外卖的简易APP.项目主要目的是为了快速上手,如何快速使用uniapp开发一个app项目,同时掌握一些 ...

  6. virtualapp安装应用流程源码分析

    1. HomeActivity 为处理的入口 @Override protected void onActivityResult(int requestCode, int resultCode, In ...

  7. Docker实践之06-访问仓库

    目录 什么是仓库 一.Docker Hub 注册 登录 拉取镜像 推送镜像 自动创建 二.私有仓库 Docker Registry 安装Docker Registry 在私有仓库上传/搜索/下载镜像 ...

  8. 【LeetCode剑指offer#04】包含min函数的栈、栈的压入、弹出序列(辅助栈的应用)

    包含min函数的栈 https://leetcode.cn/problems/bao-han-minhan-shu-de-zhan-lcof/ 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元 ...

  9. .NET应用国际化支持-葡萄牙语下如何不区分重音的模糊查询

    葡萄牙语,作为一种罗曼语族的语言,其正字法(orthography)并不使用音标系统来标记发音,而是有一套特定的拼写规则.然而,葡萄牙语中确实使用重音符号(acentos)来标记某些元音的重音(str ...

  10. C++ //类模板与继承 //类模板与继承 //注意: //1.当子类继承父类是一个类模板时,子类在声名的时候,要指定出父类中T的类型 //2.如果不指定,编译器无法给子类分配内存 //3.如果想灵活指定出父类中的T的类型,子类也需要变为类模板

    1 #include <iostream> 2 #include <string> 3 #include<fstream> 4 using namespace st ...