CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

计算公式问题

楼主piaoyu581(欣欣我心)2006-03-13 11:33:53 在 .NET技术 / C# 提问

我现在有一个公式是字符串类型:“(2+3)/4-1”,我想求的计算结果  
  是不是一定要按运算符分解开转化成相应的类型,才可以啊?  
  有没有方便一点的办法啊? 问题点数:50、回复次数:9Top

1 楼LixingTie(生铁)回复于 2006-03-13 11:51:01 得分 5

本人收集了一个类,是用来计算字符串格式的表达式的。  
   
  using   System;  
  using   System.CodeDom.Compiler;  
  using   System.Reflection;  
  using   System.Text;  
  using   Microsoft.CSharp;  
   
  namespace   Expression  
  {  
          ///   <summary>  
          ///   计算表达式的类  
          ///   </summary>  
          public   class   CalculateExpression  
          {  
                  ///   <summary>  
                  ///   接受一个string类型的表达式并计算结果,返回一个object对象,静态方法  
                  ///   </summary>  
                  ///   <param   name="expression"></param>  
                  ///   <returns></returns>  
                  public   static   object   Calculate(string   expression)  
                  {  
                          string   className   =   "Calc";  
                          string   methodName   =   "Run";  
                          expression   =   expression.Replace("/",   "*1.0/");  
   
                          //   创建编译器实例。    
                          CodeDomProvider   complier   =   (new   Microsoft.CSharp.CSharpCodeProvider());  
                          //   设置编译参数。    
                          CompilerParameters   paras   =   new   CompilerParameters();  
                          paras.GenerateExecutable   =   false;  
                          paras.GenerateInMemory   =   true;  
   
                          //   创建动态代码。    
                          StringBuilder   classSource   =   new   StringBuilder();  
                          classSource.Append("public   class   "   +   className   +   "\n");  
                          classSource.Append("{\n");  
                          classSource.Append("         public   object   "   +   methodName   +   "()\n");  
                          classSource.Append("         {\n");  
                          classSource.Append("                 return   "   +   expression   +   ";\n");  
                          classSource.Append("         }\n");  
                          classSource.Append("}");  
   
                          //   编译代码。    
                          CompilerResults   result   =   complier.CompileAssemblyFromSource(paras,   classSource.ToString());  
   
                          //   获取编译后的程序集。    
                          Assembly   assembly   =   result.CompiledAssembly;  
   
                          //   动态调用方法。    
                          object   eval   =   assembly.CreateInstance(className);  
                          MethodInfo   method   =   eval.GetType().GetMethod(methodName);  
                          object   reobj   =   method.Invoke(eval,   null);  
                          GC.Collect();  
                          return   reobj;  
                  }  
          }  
  }Top

2 楼hyena041(陷入自己的思维中,找不到自己了)回复于 2006-03-13 11:56:55 得分 5

赞一下,2楼的东西,收藏了  
  呵呵Top

3 楼LixingTie(生铁)回复于 2006-03-13 11:59:28 得分 0

该类的Calculate方法接收一个string字符串,通过编译器编译计算出结果,返回一个object值。楼主的问题只要调用该类的Calculate方法把字符串传进去就可以了。  
  string   str   =   "(2+3)/4-1";  
  double   result;  
  result   =   (double)   Expression.CalculateExpression.Calcualte(str);  
   
  该类也可以计算其它类型的表达式。例如调用方法传进字符串"3>2",则返回true;Top

4 楼LixingTie(生铁)回复于 2006-03-13 12:01:26 得分 0

顺便说一句,这个类的代码是C#2.0环境下的,用VS2003运行可能会报错,建议用VS2005Top

5 楼piaoyu581(欣欣我心)回复于 2006-03-13 12:10:21 得分 0

谢二楼的了~~不过我的项目是VS2003的~~~  
  先试下再说~Top

6 楼piaoyu581(欣欣我心)回复于 2006-03-13 12:14:17 得分 0

汗。。。1.1框架CodeDomProvider好象不包含对CompileAssemblyFromSource的定义哦Top

7 楼Montaque(每天回答两个问题)回复于 2006-03-13 12:19:55 得分 5

http://montaque.cnblogs.com/archive/2005/12/28/306407.htmlTop

8 楼LixingTie(生铁)回复于 2006-03-13 12:46:56 得分 35

吼吼~~~~~应各位要求,改了一下,下面是.Net   framework   1.1版本的,感谢各位的支持!!  
   
  using   System;  
  using   System.CodeDom.Compiler;  
  using   System.Reflection;  
  using   System.Text;  
  using   Microsoft.CSharp;  
   
  namespace   Expression  
  {  
          ///   <summary>  
          ///   计算表达式的类  
          ///   </summary>  
          public   class   CalculateExpression  
          {  
                  ///   <summary>  
                  ///   接受一个string类型的表达式并计算结果,返回一个object对象,静态方法  
                  ///   </summary>  
                  ///   <param   name="expression"></param>  
                  ///   <returns></returns>  
                  public   static   object   Calculate(string   expression)  
                  {  
                          string   className   =   "Calc";  
                          string   methodName   =   "Run";  
                          expression   =   expression.Replace("/",   "*1.0/");  
   
                          //   创建编译器实例。    
                          ICodeCompiler   complier   =   (new   CSharpCodeProvider().CreateCompiler());  
   
                          //   设置编译参数。    
                          CompilerParameters   paras   =   new   CompilerParameters();  
                          paras.GenerateExecutable   =   false;  
                          paras.GenerateInMemory   =   true;  
   
                          //   创建动态代码。    
                          StringBuilder   classSource   =   new   StringBuilder();  
                          classSource.Append("public   class   "   +   className   +   "\n");  
                          classSource.Append("{\n");  
                          classSource.Append("         public   object   "   +   methodName   +   "()\n");  
                          classSource.Append("         {\n");  
                          classSource.Append("                 return   "   +   expression   +   ";\n");  
                          classSource.Append("         }\n");  
                          classSource.Append("}");  
   
                          //   编译代码。    
                          CompilerResults   result   =   complier.CompileAssemblyFromSource(paras,   classSource.ToString());  
   
                          //   获取编译后的程序集。    
                          Assembly   assembly   =   result.CompiledAssembly;  
   
                          //   动态调用方法。    
                          object   eval   =   assembly.CreateInstance(className);  
                          MethodInfo   method   =   eval.GetType().GetMethod(methodName);  
                          object   reobj   =   method.Invoke(eval,   null);  
                          GC.Collect();  
                          return   reobj;  
                  }  
          }  
  }  
   
  本人QQ   260031207 欢迎来交流!!Top

9 楼piaoyu581(欣欣我心)回复于 2006-03-13 14:11:05 得分 0

谢楼上的了~~~看来偶这方面的知识要好好补补了~~~  
  结帐Top

相关问题

  • 公式计算的问题:
  • 如何存储公式和计算公式
  • 如何设置计算公式
  • 计算公式存储提取问题
  • 文本类型公式计算问题?
  • 问个多重计算公式
  • 求救用javascript教研计算公式
  • 谁给我一个计算公式阿
  • 这个是不是有计算公式?
  • 能不能自动计算公式???

关键词

  • 编译
  • 编译器
  • 代码
  • csharp
  • classsource
  • 表达式
  • 计算
  • 字符串
  • reobj
  • paras

得分解答快速导航

  • 帖主:piaoyu581
  • LixingTie
  • hyena041
  • Montaque
  • LixingTie

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo