模板引擎用过很多,但是这次在开发前就关注了Razor他的语法很接近NVelocity,下面做了个演示,供大家学习交流。
using System;
using System.CodeDom.Compiler;
using System.IO;
using System.Linq;
using System.Web.Razor;
using Microsoft.CSharp;
public class Razor
{
public abstract class Template : IDisposable
{
public Template()
{
this.Output = new StringWriter();
}
public StringWriter Output { get; private set; }
//写入变量
public virtual void Write(object value)
{
this.WriteLiteral(value);
}
//写入标记
public virtual void WriteLiteral(object value)
{
this.Output.Write(value);
}
//入口函数
public abstract void Execute();
void IDisposable.Dispose()
{
this.Output.Dispose();
}
}
public static Template Parse(string s)
{
var host = new RazorEngineHost(new CSharpRazorCodeLanguage());
host.DefaultBaseClass = typeof(Template).FullName;
host.DefaultNamespace = "xiaodao";
host.DefaultClassName = "Template";
host.NamespaceImports.Add("System");
var engine = new RazorTemplateEngine(host);
using (var reader = new StringReader(s))
{
var generator = engine.GenerateCode(reader);
using (var provider = new CSharpCodeProvider())
{
var compiler = new CompilerParameters(); //更多引用在这里初始参数中加入
compiler.ReferencedAssemblies.Add("System.dll");
compiler.GenerateInMemory = true; //在内存中编译
var result = provider.CompileAssemblyFromDom(compiler, generator.GeneratedCode);
if (result.Errors.HasErrors) //错误检查
{
var error = result.Errors.OfType<CompilerError>().Where(i => !i.IsWarning).FirstOrDefault();
if (error != null) throw new Exception(error.ErrorText); //抛出错误
}
return (Template)result.CompiledAssembly.CreateInstance("xiaodao.Template");
}
}
}
using System.CodeDom.Compiler;
using System.IO;
using System.Linq;
using System.Web.Razor;
using Microsoft.CSharp;
public class Razor
{
public abstract class Template : IDisposable
{
public Template()
{
this.Output = new StringWriter();
}
public StringWriter Output { get; private set; }
//写入变量
public virtual void Write(object value)
{
this.WriteLiteral(value);
}
//写入标记
public virtual void WriteLiteral(object value)
{
this.Output.Write(value);
}
//入口函数
public abstract void Execute();
void IDisposable.Dispose()
{
this.Output.Dispose();
}
}
public static Template Parse(string s)
{
var host = new RazorEngineHost(new CSharpRazorCodeLanguage());
host.DefaultBaseClass = typeof(Template).FullName;
host.DefaultNamespace = "xiaodao";
host.DefaultClassName = "Template";
host.NamespaceImports.Add("System");
var engine = new RazorTemplateEngine(host);
using (var reader = new StringReader(s))
{
var generator = engine.GenerateCode(reader);
using (var provider = new CSharpCodeProvider())
{
var compiler = new CompilerParameters(); //更多引用在这里初始参数中加入
compiler.ReferencedAssemblies.Add("System.dll");
compiler.GenerateInMemory = true; //在内存中编译
var result = provider.CompileAssemblyFromDom(compiler, generator.GeneratedCode);
if (result.Errors.HasErrors) //错误检查
{
var error = result.Errors.OfType<CompilerError>().Where(i => !i.IsWarning).FirstOrDefault();
if (error != null) throw new Exception(error.ErrorText); //抛出错误
}
return (Template)result.CompiledAssembly.CreateInstance("xiaodao.Template");
}
}
}
}
调用方法:
var s = @"@{var now = DateTime.Now;
}
@now.Year";
var template = Razor.Parse(s);
template.Execute();
template.Output.GetStringBuilder().ToString(); //返回结果
@now.Year";
var template = Razor.Parse(s);
template.Execute();
template.Output.GetStringBuilder().ToString(); //返回结果