Razor模板解析演练

 

模板引擎用过很多,但是这次在开发前就关注了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 " );
            }
        }
    }
} 

 

 调用方法:

var s = @"@{var now = DateTime.Now;
}

@now.Year
" ;
var template 
=  Razor.Parse(s);
template.Execute();
template.Output.GetStringBuilder().ToString(); 
// 返回结果

 

你可能感兴趣的:(模板解析)