通过动态编译获取字符串表达的值

看到许多人经常问到这个问题: 怎么由字符串 “126 + (256 - 2^4 )”,或者怎么判断 “115 > 56 || 14<45”的结果等等,在MSDN上查了查,写了一个Eval类
 /*****************************************************************
** 文件名:       Eval.cs
** Copyright (c) 1999 -2003
** 创建人:       Phoenix
** 创建日期:
** 修改人:
** 修改日期:
** 描 述:         获取字符串所表示的逻辑意义
** 版 本:1.0
******************************************************************/
using System.CodeDom;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Reflection;

public class Eval
{
static object GetValue( string value )
 {
   string codeSnippet = "using System; " + "\r\n" +
                                   "namespace CzG {" + "\r\n" +
                                               " public class Eval" + "\r\n" +
                                               " {" + "\r\n" +
                                   "       public Eval(){} " + "\r\n" +
                                               "  public object GetValue()" + "\r\n" +
                                               "  {" + "\r\n" +
                                               "   return " + value + ";" + "\r\n" +
                                               "  }" + "\r\n" +
                                               " } }";
 

   CodeSnippetCompileUnit unit = new CodeSnippetCompileUnit( codeSnippet );
 
   ICodeCompiler compiler =  new CSharpCodeProvider().CreateCompiler();
   CompilerParameters para = new CompilerParameters();
   para.ReferencedAssemblies.Add( "System.dll" );
   para.GenerateInMemory = true;
   para.GenerateExecutable = false;
   para.OutputAssembly = "Eval.dll";
  
   Assembly asm = compiler.CompileAssemblyFromDom( para , unit ).CompiledAssembly;
  
   Type type = asm.GetType( "CzG.Eval" );
   MethodInfo mi = type.GetMethod( "GetValue" , BindingFlags.Public | BindingFlags.Instance ); 
  
   object obj = asm.CreateInstance( "CzG.Eval" );
   return mi.Invoke( obj , null );
  }
}

----------------------------------

调用:

Console.WriteLine( Eval.GetValue(“125 -23” ) );
Console.WriteLine( Eval.GetValue(“125<23“ ) );

Output:
102
False

时间: 2024-11-08 23:21:11

通过动态编译获取字符串表达的值的相关文章

C#: 通过动态编译获取字符串所表达的值

编译|动态|字符串 看到许多人经常问到这个问题: 怎么由字符串 "126 + (256 - 2^4 )",或者怎么判断 "115 > 56 || 14<45"的结果等等,在MSDN上查了查,写了一个Eval类 /******************************************************************* 文件名: Eval.cs** Copyright (c) 1999 -2003 ** 创建人: Phoenix

获取数据-【求助】动态生成的checkbox如何取值??

问题描述 [求助]动态生成的checkbox如何取值?? 我动态生成了一些checkbox(从数据库中获取数据),现在想要实现获取checkbox选中或者未选中的状态来更新数据库,请问如何实现?? 解决方案 根据选中或者未选中,生成相应的update语句,然后执行就行了 解决方案二: 呢 谢谢PB的回答,可是我在遍历PlaceHolder中的checkbox控件时,for (int i = 0; i < this.PH.Controls.Count - 1; i++),那个controls.co

我的Java开发学习之旅------&amp;gt;工具类:Java获取字符串和文件进行MD5值

ps:这几天本人用百度云盘秒传了几部大片到云盘上,几个G的文件瞬秒竟然显示"上传成功"!这真让我目瞪口呆,要是这样的话,那得多快的网速,这绝对是不可能的,也许这仅是个假象.百度了一下才发现所谓的"秒传"是常见的"忽略式"上传方式,就是您上传了一个文件名为111.exe,MD5为一个数,有一个网友以前也上传一个叫222.exe,MD5和您上传的文件MD5码一模一样,所以这个文件上传到服务器上的时间就很短了,这是因为别人上传过这个文件,您上传这个文件

如何把地址栏动态传入的参数名的值获取,id3、id5、id8……数目和参数名均由前台复选框勾选产生

问题描述 如何把地址栏动态传入的参数名的值获取,id3.id5.id8--数目和参数名均由前台复选框勾选产生 解决方案 首先,你的len不对,地址栏里的len=4,表示选中的id有4个,可是你至少需要得到id11,所以使用i<=len不可能遍历到id11, 你应该将len设置成所有id的个数.然后遍历所有的id,接收所有的request.getParameter("id"+i),如果获取的对象为null,表示没有选中, 否则则选中了该id,即可进行操作. 解决方案二: 表单met

jquery获取动态添加的input标签的值

问题描述 jquery获取动态添加的input标签的值 在点击修改后插入input标签,做修改后点击保存并更新 插入input标签代码: function upZPrice(leId){ var zprice=$(""#le_""+leId).html(); $(""#le_""+leId).html(""""); $(""#up_""+leId)

C#动态编译计算表达式的值

C#动态编译计算表达式的值,是通过System.CodeDom.Compiler命名空间下的相关类来实现的.其步骤大致为: 1.将表达式包装成为可编译的C#代码 2.使用反射调用上一步编译的代码. 示例如下:在界面上放一个TextBox,用来输入表达式:放一个按钮,用来相应用户点击,以进行表达式的计算:在另外一个TextBox中显示计算结果.对应的xaml代码如下: <Window x:Class="SampleCodeDemo.MainWindow" xmlns="h

java-怎样结一个json字符串类型的值动态增加为HTML标签

问题描述 怎样结一个json字符串类型的值动态增加为HTML标签 ${question.title} ${question.type.name} ${question.issue }/c:if/c:forEach 其中${question.issue }是{"A":"三国","B":"隋唐","C":"魏晋南北朝","D":"汉朝"} 将它转换为四

代码-如何动态第获取td的值

问题描述 如何动态第获取td的值 一个table中有两行tr,如图所示,第二行数量不定,用c:foreach遍历而成的,有6~18个左右的td,怎么动态点击每个数字框并获取前面的值.附上代码.求指点.谢谢. <table id="peopleStatus" class="table table-bordered"> <tr> <td colspan="18">居民人员状况</td></tr&g

JavaScript使用encodeURI()和decodeURI()获取字符串值的方法_javascript技巧

本文实例讲述了JavaScript使用encodeURI()和decodeURI()获取字符串值的方法.分享给大家供大家参考.具体如下: JavaScript使用encodeURI()和decodeURI()获取字符串值,不能就是地址栏显示的字串,以前经常在网上见到有人问此问题,无意在网上发现,不知是不是您想要的,先看看效果吧. 先来看看运行效果: 具体代码如下: <html> <head> <meta http-equiv="Content-Type"