c#中动态输入和计算 代数表达式
2015-09-17 11:45
330 查看
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.ComponentModel;
using System.CodeDom;
using System.CodeDom.Compiler;
using Microsoft.JScript;
using System.Reflection;
下面是一个完整的类,代码已经测试过
/// <summary>
/// 动态求值
/// </summary>
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);
}
}";
}
调用很简单:Evaluator.Eval( "4*9+8" ) 返回的object 对象转化为数字就是计算的结果
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.ComponentModel;
using System.CodeDom;
using System.CodeDom.Compiler;
using Microsoft.JScript;
using System.Reflection;
下面是一个完整的类,代码已经测试过
/// <summary>
/// 动态求值
/// </summary>
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);
}
}";
}
调用很简单:Evaluator.Eval( "4*9+8" ) 返回的object 对象转化为数字就是计算的结果
相关文章推荐
- C#中通过Process启动的外部第三方程序MainWindowHandle句柄为0
- C#句柄使用
- C#动态链接库的创建及使用
- C# 中获取的网页的字符转换问题
- C# 下载远程文件
- C# 淘宝数据包下载,生成csv格式。可直接通过淘宝助理上传到淘宝店铺
- 设计模式C#实现(七)——生成器模式
- 群蚁算法理论与实践全攻略——旅行商等路径优化问题的新方法【附C#群蚁算法完整项目代码】
- VS2010中C#调用C函数
- C# WinForm 解决子窗体放大后,子窗体图标放大的问题
- 设计模式C#实现(六)——单例模式
- C# 01 Hello World
- C#学习笔记(一)
- C#栈的简单介绍及应用
- C#多线程学习(一) 多线程的相关概念(转)
- C# 操作系统回收站
- C#机制
- C#~异步编程再续~async异步方法与同步方法的并行
- LeetCode 10 正则表达式匹配
- c#基于这些,你已经看到了?(一)-----谁才刚刚开始学习使用