模板引擎用过很多,但是这次在开发前就关注了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 { getprivate 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 != nullthrow 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(); 
//返回结果

 

相关文章:

  • 2022-02-21
  • 2022-12-23
  • 2021-08-29
  • 2022-02-16
  • 2022-12-23
  • 2021-12-07
  • 2021-07-25
猜你喜欢
  • 2022-12-23
  • 2021-11-20
  • 2021-07-04
  • 2022-12-23
相关资源
相似解决方案