当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 如何在C#里面象js一样可以直接计算字符串的值

ASP.NET
DVNEWS 3.2 1013版免虚拟目录的安装方法,只要三个步骤
DataRow的序列化问题
VB.net基础:使用UDP发送和接收消息
采用HttpModules来重写URLs(实践篇)
要用到事务了
DataGrid中单元格的比较
动态引用WebService,建立WebService虚拟机
[初学VB.NET]数据绑定
使用ASP调用WebService时不能以Name为数据库中的字段
在VB.NET里操作文本文件
web下打印的办法
怎样把SQL_SERVER数据库里的(类型是image)图片显示在aspx页面里的image控件里
C#中字符串的加密
中小企业信息应用的利器:DAP-Dynamic Applications Platform
数据库系统概论学习笔记
体会到译者的艰辛,也发现了他们犯的错误
IISManager V1.1 是一个在线管理IIS,维护站点组件,安全稳定,最重要的是完全免费。
VS FlexGridPro 8.0如何在window98运行---有没有升级版本,急请高手指点
给立方体添加纹理
Wrox的C#高级编程第三版第一部分第一章(1~9页)

ASP.NET 中的 如何在C#里面象js一样可以直接计算字符串的值


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 235 ::
收藏到网摘: n/a

今天在论坛里面逛发现一个问题比较典型,我们在使用js的时候可以直接使用Eval得到某一个表达式的值,在C#里面可以吗?答案是肯定的,在.NET提供的丰富的类库里面这是可以实现的,但是没有js那么简单下面我将使用一个简单的例子来说明利用编译器和反射得到一个字符串表达式的值。我们建立一个Windows窗体里面有如下的方法:引用一下命名空间:using System;using System.Text;using System.CodeDom.Compiler;using System.Reflection;using System.IO;using Microsoft.CSharp;命名空间的具体意义就不说了,下面看看代码,为了可以让我们的工程可以重复使用我们新建一个类库工程名叫:CoustomEval其中有一个类是用来计算某一断字符串的值。详细代码如下所示:namespace CoustomEval{ /// /// Summary description for Class1. /// public class MyEval{ public MyEval(){ // // TODO: Add constructor logic here // } public object Eval(string cCharpCode){ CSharpCodeProvider csharpCodeProvider = new CSharpCodeProvider(); ICodeCompiler compiler = csharpCodeProvider.CreateCompiler(); CompilerParameters cp = new CompilerParameters(); cp.ReferencedAssemblies.Add("system.dll"); cp.CompilerOptions = "/t:library"; cp.GenerateInMemory = true; StringBuilder myCode = new StringBuilder(); myCode.Append("using System;"); myCode.Append("namespace CoustomEval{"); myCode.Append("class myLib {private "+cCharpCode+" public int myMethod(){return i;}}"); myCode.Append("}"); CompilerResults cr = compiler.CompileAssemblyFromSource(cp,myCode.ToString()); Assembly assembly = cr.CompiledAssembly; object tmp = assembly.CreateInstance("CoustomEval.myLib"); Type type = tmp.GetType(); MethodInfo mi = type.GetMethod("myMethod"); object result = mi.Invoke(tmp,null); return result; } }} 上面的类库只具有一般代表性不具备一般使用性,重要的是提供一种方法来实现它,所以我在里面使用了硬编码的方式,如果你喜欢可以使用其他的方式,包括读文件,读数据库取得代码段等等。然后我们在建立一个测试工程,该工程里面有一个测试窗体,该窗体上有一个按钮和两个文本框,其中一个文文本框用来输入要计算的值,另一个显示计算的结果,详细代码如下:private void button1_Click(object sender, System.EventArgs e) { MyEval eval = new MyEval(); object result = eval.Eval(this.textBox1.Text); this.textBox2.Text = result.ToString(); }在这个工程中需要引用上面的工程,这样我们就可以使用MyEval类来实现计算TextBox1里面的值了,最后可以将值显示在TextBox2里面,代码运行的结果我在这里就不帖了。只给出我的测试结果,由于该问题源于论坛所以我就是用论坛中原来的测试要求。测试结果:在TextBox中输入int i = 10;点击Button1以后将会在TextBox2中显示出10。当然你可以使用更复杂的计算表达式!这里的目的是为了给您指出实现该功能的做法,至于实现的复杂程度读者可以自己决定。谢谢阅读,文中有什么错误和遗漏,请指正,也可以直接给我来信 [email protected]