因为在我的某个工具包里需要能动态执行一段代码进行求值的功能,也就是类似于JAVA SCRIPT里的Eval函数和VB SCRIPT的Execute函数功能,但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;
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
{
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
等等..
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.
{
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:写个类库,调用JS的Eval函数。编译成DLL然后在其他该调用的地方。引用这个DLL就可以了。
后来通过百度搜索。到如下更好的类:
类一:采用引用Microsoft.CSharp;
using System;
using System.CodeDom;
using System.CodeDom;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Text;
using System.Reflection;
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);
{
/// <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);
}
{
EvaluatorItem[] items = { new EvaluatorItem(returnType, expression, name) };
ConstructEvaluator(items);
}
public Evaluator(EvaluatorItem item)
{
EvaluatorItem[] items = { item };
ConstructEvaluator(items);
}
{
EvaluatorItem[] items = { item };
ConstructEvaluator(items);
}
private void ConstructEvaluator(EvaluatorItem[] items)
{
ICodeCompiler comp = (new CSharpCodeProvider().CreateCompiler());
{
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;
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.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("} }");
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)
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
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 int EvaluateInt(string name)
{
return (int) Evaluate(name);
}
public string EvaluateString(string name)
{
return (string) Evaluate(name);
}
{
return (string) Evaluate(name);
}
public bool EvaluateBool(string name)
{
return (bool) Evaluate(name);
}
{
return (bool) Evaluate(name);
}
public object Evaluate(string name)
{
MethodInfo mi = _Compiled.GetType().GetMethod(name);
return mi.Invoke(_Compiled, null);
}
#endregion
{
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 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);
{
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小时内删除。
发表评论