using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Web.Razor;
using System.IO; namespace lxw_Compiler_RazorEngine
{
public partial class frmMain : Form
{
public frmMain()
{
InitializeComponent();
} private void btnGenerate_Click(object sender, EventArgs e)
{ string TemplateString = txtTemplate.Text;
Type ModelType = typeof(SampleModel);
string TemplateName = "T" + Guid.NewGuid().ToString("N") + "Template"; CSharpCodeProvider CodePrivoder = new CSharpCodeProvider();
ICodeCompiler objICodeCompiler = CodePrivoder.CreateCompiler(); var @params = new CompilerParameters();
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
if (assembly.ManifestModule.Name != "<In Memory Module>")
@params.ReferencedAssemblies.Add(assembly.Location);
}
@params.GenerateInMemory = true;
@params.IncludeDebugInformation = false;
@params.GenerateExecutable = false;
@params.CompilerOptions = "/target:library /optimize"; var host = new RazorEngineHost(new CSharpRazorCodeLanguage());
host.DefaultBaseClass = string.Format("lxw_Compiler_RazorEngine.RazorTemplateBase<{0}>", ModelType.FullName);
host.DefaultNamespace = "lxw_Compiler_RazorEngine";
host.DefaultClassName = TemplateName;
host.NamespaceImports.Add("System");
GeneratorResults razorResult = null;
using (TextReader reader = new StringReader(TemplateString))
{
razorResult = new RazorTemplateEngine(host).GenerateCode(reader);
} var builder = new StringBuilder();
var codeProvider = new CSharpCodeProvider();
using (var writer = new StringWriter(builder))
{
codeProvider.GenerateCodeFromCompileUnit(razorResult.GeneratedCode, writer, new CodeGeneratorOptions());
} var result = codeProvider.CompileAssemblyFromSource(@params, new[] { builder.ToString() }); if (result.Errors.HasErrors)
{
StringBuilder sbErrs = new StringBuilder(builder.ToString() + System.Environment.NewLine);
sbErrs.Append("-----------代码中存在语法错误!-----------" + System.Environment.NewLine);
foreach (CompilerError err in result.Errors)
{
sbErrs.AppendFormat("{0},{1}" + System.Environment.NewLine, err.ErrorNumber, err.ErrorText);
}
MessageBox.Show(sbErrs.ToString());
return;
} SampleModel sampleModel = new SampleModel();
sampleModel.Prop1 = "lxw01";
sampleModel.Prop2 = "lxw02";
sampleModel.Prop3 = new List<string> { "lxw03-1", "lxw03-2", "lxw03-3" }; var template = (RazorTemplateBase<SampleModel>)result.CompiledAssembly.CreateInstance("lxw_Compiler_RazorEngine." + TemplateName);
template.Model = sampleModel;
template.Execute();
var output = template.Buffer.ToString();
template.Buffer.Clear(); txtResult.Text = output; } private void frmMain_Load(object sender, EventArgs e)
{ } } public class SampleModel
{
public string Prop1 { get; set; }
public string Prop2 { get; set; }
public List<string> Prop3 { get; set; } } public abstract class RazorTemplateBase<T>
{
public T Model { get; set; } public StringBuilder Buffer { get; set; } protected RazorTemplateBase()
{
Buffer = new StringBuilder();
} public abstract void Execute(); public virtual void Write(object value)
{
WriteLiteral(value);
} public virtual void WriteLiteral(object value)
{
Buffer.Append(value);
} }
}

附件下载

使用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. Linux dmesg命令使用方法详解

    一.命令简介  dmesg(display message)命令用于显示开机信息.kernel 会将开机信息存储在 ring buffer 中.您若是开机时来不及查看信息,可利用 dmesg 来查看. ...

  2. 【Unity3D】花瓣特效

    1 花瓣绘制原理 ​ 如下图是实现的花瓣特效效果,为方便描述,我们将每个红色的扁状长条称为花瓣,每个花瓣中心的绿点称为花蕊,花朵的正中心称为花心. ​ 我们在 xOz 平面上绘制花朵,假设花心为 O ...

  3. 【Unity3D】导航系统

    1 导航系统简介 ​ 导航系统用于智能避障并寻找目标物体,如:王者荣耀中,当玩家跑到敌方塔的攻击范围内,敌方塔就会发射火团攻击玩家,当玩家逃跑时,火团会智能跟随玩家,其中智能跟随就使用到了导航系统. ...

  4. python中两个不同shape的数组间运算规则

    1 前言 声明:本博客讨论的数组间运算是指四则运算,如:a+b.a-b.a*b.a/b,不包括 a.dot(b) 等运算,由于 numpy 和 tensorflow 中都遵循相同的规则,本博客以 nu ...

  5. Swoole从入门到入土(1)——入坑

    入坑一个话题,总得有入坑的理由.有好多话题可供选择,但是思来想去,对于PHPer进阶与其急着去掌握一门新的语言,匆忙地踏足一个新的知识体系,还不如先把php圈子的技能点攒齐了. 话说Swoole诞生之 ...

  6. 我们在SqlSugar开发框架中,用到的一些设计模式

    我们在<SqlSugar开发框架>中,有时候都会根据一些需要引入一些设计模式,主要的目的是为了解决问题提供便利和代码重用等目的.而不是为用而用,我们的目的是解决问题,并在一定的场景下以水到 ...

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

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

  8. Spring Boot+Eureka+Spring Cloud微服务快速上手项目实战

    说明 我看了一些教程要么写的太入门.要么就是写的太抽象.真正好的文章应该是快速使人受益的而不是浪费时间.本文通过一个包括组织.部门.员工等服务交互的案例让刚接触spring cloud微服务的朋友快速 ...

  9. Java Swing实现五子棋程序

    首先感谢08年MLDN出的这个培训视频,我把代码和文档整理了一下,发布出来给需要学习Swing的朋友. 源码地址: https://gitee.com/indexman/gobang 一.知识点准备: ...

  10. 《系列二》-- 11、Aware是什么

    目录 正文 阅读之前要注意的东西:本文就是主打流水账式的源码阅读,主导的是一个参考,主要内容需要看官自己去源码中验证.全系列文章基于 spring 源码 5.x 版本. 写在开始前的话: 阅读spri ...