在C#中实现类似Eval这类动态求值的函数【转载】
2009-04-23 14:33
561 查看
这是一个很平常的需求,就好比说,给你一个字符串,1+2+3, 要动态计算它的结果。在VBS或者JAVASCRIPT这种脚本语言中,都有一个Eval方法。但在C#或者VB.NET中却没有。今天想起来研究一下,发现有朋友已经实现了。请参考下面的连接。很有意思的,呵呵
本文转载自 /article/4882128.html
using System;
using System.CodeDom.Compiler;
using System.Reflection;
public class Evaluator
{
/// <summary>
/// 计算结果,如果表达式出错则抛出异常
/// </summary>
/// <param name="statement">表达式,如"1+2+3+4"</param>
/// <returns>结果</returns>
public static object Eval(string statement)
{
return _evaluatorType.InvokeMember(
"Eval",
BindingFlags.InvokeMethod,
null,
_evaluator,
new object[] { statement }
);
}
/// <summary>
///
/// </summary>
static Evaluator()
{
//构造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");
_evaluator = Activator.CreateInstance(_evaluatorType);
}
private static object _evaluator = null;
private static Type _evaluatorType = null;
/// <summary>
/// JScript代码
/// </summary>
private static readonly string _jscriptSource =
@"class Evaluator
{
public function Eval(expr : String) : String
{
return eval(expr);
}
}";
}
这里还有一个更加复杂的实现方式
/content/4852890.html
http://www.yaosansi.com/post/446.html
还有一个更加好的例子
http://www.codeproject.com/KB/cs/runtime_eval.aspx
利用动态编译的机制实现
本文转载自 /article/4882128.html
using System;
using System.CodeDom.Compiler;
using System.Reflection;
public class Evaluator
{
/// <summary>
/// 计算结果,如果表达式出错则抛出异常
/// </summary>
/// <param name="statement">表达式,如"1+2+3+4"</param>
/// <returns>结果</returns>
public static object Eval(string statement)
{
return _evaluatorType.InvokeMember(
"Eval",
BindingFlags.InvokeMethod,
null,
_evaluator,
new object[] { statement }
);
}
/// <summary>
///
/// </summary>
static Evaluator()
{
//构造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");
_evaluator = Activator.CreateInstance(_evaluatorType);
}
private static object _evaluator = null;
private static Type _evaluatorType = null;
/// <summary>
/// JScript代码
/// </summary>
private static readonly string _jscriptSource =
@"class Evaluator
{
public function Eval(expr : String) : String
{
return eval(expr);
}
}";
}
这里还有一个更加复杂的实现方式
/content/4852890.html
http://www.yaosansi.com/post/446.html
还有一个更加好的例子
http://www.codeproject.com/KB/cs/runtime_eval.aspx
利用动态编译的机制实现
相关文章推荐
- 在C#中实现类似Eval这类动态求值的函数【转载】
- C#动态执行类库中的函数:利用反射实现(js)Eval,asp(Execute)功能
- C#利用反射实现(js)Eval,asp(Execute)功能 动态执行类库中的函数
- C#程序实现动态调用DLL的研究(转载)
- Java实现类似eval()函数或exec()函数的功能
- C#动态执行函数:利用反射实现
- 转载: c#实现动态加载Dll 收藏
- 利用C#动态编译功能实现像Javascript中的Eval的功能来将一段字符串进行数学运算
- 用C#通过反射实现动态调用WebService 告别Web引用(转载)
- C#函数如何实现类似多个返回值的功能
- SQL实现类似C#的Split()函数的功能
- 利用C#的动态类型来实现与rails类似的元编程(2)
- [转载]C#如何实现对外部程序的动态调用
- C#实现的根据年月日计算星期几的函数 (转载)
- c#中实现类似js的Eval|.NET中执行Javascript(表达式是字符串的计算)
- 类似策略模式,Qt实现动态函数调用
- C#动态执行函数:利用反射实现
- C#中实现js中的eval函数功能
- c#中实现类似js的Eval方法
- C#程序实现动态调用DLL的研究(转载)