因为在我的某个工具包里需要能动态执行一段代码进行求值的功能,也就是类似于JAVA SCRIPT里的Eval函数和VB SCRIPTExecute函数功能,但C#VB.NET却没有类似的函数:( 只能手动编写。上网搜索了一下,幸运的从一个英文站点到了:)代码量很少,它是通过调用JScript.NET里的Eval函数进行处理的,下面是代码(部分代码我修改与删减过,并非完整的原代码,在此感谢原作者scott):
usingusingusing///<summary>//////</summary>
publicclass///<summary>//////</summary>///<param name="statement">表达式,"1+2+3+4"</param>///<returns>结果</returns>
publicstaticobject Eval(stringreturn"Eval",
                        BindingFlags.InvokeMethod,
nullnewobject[] { statement }///<summary>//////</summary>
static//构造JScript的编译驱动代码
            CodeDomProvider provider = CodeDomProvider.CreateProvider("JScript");

            CompilerParameters parameters;
            parameters =new CompilerParameters();
            parameters.GenerateInMemory =true;

            CompilerResults results;
            results = provider.CompileAssemblyFromSource(parameters, _jscriptSource);

            Assembly assembly = results.CompiledAssembly;
            _evaluatorType = assembly.GetType("Evaluator"= Activator.CreateInstance(_evaluatorType);
        }privatestaticobject _evaluator =nullprivatestatic Type _evaluatorType =null///<summary>//////</summary>
privatestaticreadonlystring _jscriptSource =@"class Evaluator
              {
                  public function Eval(expr : String) : String 
                  { 
                     return eval(expr); 
                  }
              }"
发表评论
直接调用即可.类似JS函数的eval函数使用.最简单的则是用于做数值计算或逻辑判断(当然可以更复杂!!如动态执行程序代码).: 

object v = Evaluator.Eval("(1+2+3)*4"); 
v的值为24 

或者做逻辑判断: 
object v = Evaluator.Eval("1>100"); 
v的值为false 

等等..
public function Eval(expr : String) : String 
{ 
return eval(expr); 
} 
其实还可以执行其它的framework中的类库,不单单是简单逻辑运算。前提是jscript引擎可以识别表达式中的类或者函数。即表达式中的标志符必须是fullname类或者在编译jscript代码时候引用命名空间,这样就可以识别已命名空间的类的shotname。要执行动态表达式代码,最好的方法还是ironpython.
支持模板目录, 模板的图片目录源码images/logo.gif 实际变成 template/sofut/images/logo.gif 这样可视化就强多了! (Else)
希望能支持字符串函数怎么获取ssi  (Else)
楼主你好,从stringtemplate换到你的模板引擎,有一点疑问,我用的是MVC,现在想用你的模板引擎来做多用户皮肤的选择。现在出现了一个问题,在扩展MVC引擎的时候,应该怎么把Tag扩展到引擎里... (SVN)
pop获取是全部的邮件,很慢,能否只读新邮件 (天骄)
@wingoo 有时间我改进一下. PS:很少有邮件是没ContentType,除非是恶意邮件:( (Kingthy)
C#中的EVAL方法
javascript中的eval是把字符串当作语句来执行。 那么在C#中哪个方法是把字符串当作语句来执?   查询了MSDN。也不到相对应的方法,于是想到用调用Javascript EVAL函数。
方法1:写个类库,调用JSEval函数。编译成DLL然后在其他该调用的地方。引用这个DLL就可以了。
后来通过百度搜索。到如下更好的类:
类一:采用引用Microsoft.CSharp;
using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Text;
using System.Reflection;
namespace ADOGuy
{
 /// <summary>
 /// Summary description for Class1.
 /// </summary>
 public class Evaluator
 {
    #region Construction
  public Evaluator(EvaluatorItem[] items)
  {
      ConstructEvaluator(items);
  }
    public Evaluator(Type returnType, string expression, string name)
    {
      EvaluatorItem[] items = { new EvaluatorItem(returnType, expression, name) };
      ConstructEvaluator(items);
    }
    public Evaluator(EvaluatorItem item)
    {
      EvaluatorItem[] items = { item };
      ConstructEvaluator(items);
    }
    private void ConstructEvaluator(EvaluatorItem[] items)
    {
      ICodeCompiler comp = (new CSharpCodeProvider().CreateCompiler());
      CompilerParameters cp = new CompilerParameters();
      cp.ReferencedAssemblies.Add("system.dll");
      cp.ReferencedAssemblies.Add("system.data.dll");
      cp.ReferencedAssemblies.Add("l.dll");
      cp.GenerateExecutable = false;
      cp.GenerateInMemory = true;
      StringBuilder code = new StringBuilder();
      code.Append("using System; \n");
      code.Append("using System.Data; \n");
      code.Append("using System.Data.SqlClient; \n");
      code.Append("using System.Data.OleDb; \n");
      code.Append("using System.Xml; \n");
      code.Append("namespace ADOGuy { \n");
      code.Append("  public class _Evaluator { \n");
      foreach(EvaluatorItem item in items)
      {
        code.AppendFormat("    public {0} {1}() ", 
                          item.ReturnType.Name, 
                          item.Name);
        code.Append("{ ");
        code.AppendFormat("      return ({0}); ", item.Expression);
        code.Append("}\n");
      }
      code.Append("} }");
      CompilerResults cr = comp.CompileAssemblyFromSource(cp, code.ToString());
      if (cr.Errors.HasErrors)
      {
        StringBuilder error = new StringBuilder();
        error.Append("Error Compiling Expression: ");
        foreach (CompilerError err in cr.Errors)
        {
          error.AppendFormat("{0}\n", err.ErrorText);
        }
        throw new Exception("Error Compiling Expression: " + error.ToString());
      }
      Assembly a = cr.CompiledAssembly;
      _Compiled = a.CreateInstance("ADOGuy._Evaluator");
    }
    #endregion
    #region Public Members
    public int EvaluateInt(string name)
    {
      return (int) Evaluate(name);
    }
    public string EvaluateString(string name)
    {
      return (string) Evaluate(name);
    }
    public bool EvaluateBool(string name)
    {
      return (bool) Evaluate(name);
    }
    public object Evaluate(string name)
    {
      MethodInfo mi = _Compiled.GetType().GetMethod(name);
      return mi.Invoke(_Compiled, null);
    }
    #endregion
    #region Static Members
    static public int EvaluateToInteger(string code)
    {
      Evaluator eval = new Evaluator(typeof(int), code, staticMethodName);
      return (int) eval.Evaluate(staticMethodName);
    }
    static public string EvaluateToString(string code)
    {
      Evaluator eval = new Evaluator(typeof(string), code, staticMethodName);
      return (string) eval.Evaluate(staticMethodName);
    }
    
    static public bool EvaluateToBool(string code)
    {
      Evaluator eval = new Evaluator(typeof(bool), code, staticMethodName);
      return (bool) eval.Evaluate(staticMethodName);
    }

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。