博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.Net实现表达式计算(公式) 表达式字符串
阅读量:5728 次
发布时间:2019-06-18

本文共 3393 字,大约阅读时间需要 11 分钟。

文档原址:

实现复杂公式计算,比如含IF分支判断等,可考虑通过调用EXCEL公式获取值。

Excel公式计算参考:

方法一: MSScriptControl.ScriptControl

VB.NET

 

[vb]
 
  1. Dim exp As String = "3 + 4"  
  2. Dim t As Type = Type.GetTypeFromProgID("MSScriptControl.ScriptControl")  
  3. Dim obj As Object = Activator.CreateInstance(t)  
  4.   
  5. t.InvokeMember("Language", System.Reflection.BindingFlags.SetProperty, _  
  6.            Nothing, obj, New Object() {
    "vbscript"})  
  7.   
  8. Dim result As Object = t.InvokeMember("Eval", System.Reflection.BindingFlags.InvokeMethod, _  
  9.                                        Nothing, obj, New Object() {exp})  
  10. MsgBox("method 1: " & CStr(result))  

 

 

C#

[c-sharp]
 
  1. var exp = "3 + (2 + 3)/5";  
  2. var type = Type.GetTypeFromProgID("MSScriptControl.ScriptControl");  
  3. var obj = Activator.CreateInstance(type);  
  4. type.InvokeMember("Language", BindingFlags.SetProperty, null,   
  5.                   obj, new object[] { "javascript" });  
  6.   
  7. var result = type.InvokeMember("Eval", BindingFlags.InvokeMethod, null,  
  8.                                obj, new object[] { exp });  
  9. Console.WriteLine("{0} = {1}", exp, result);  

 

 

方法二: CodeDOM

VB.NET

 

[vb]
 
  1. Dim oCodeProvider As VBCodeProvider = New VBCodeProvider  
  2. Dim oCParams As CompilerParameters = New CompilerParameters  
  3. Dim oCResults As CompilerResults = Nothing  
  4. Dim oAssy As System.Reflection.Assembly = Nothing  
  5. Dim oExecInstance As Object = Nothing  
  6. Dim oRetObj As Object = Nothing  
  7. Dim oMethodInfo As MethodInfo = Nothing  
  8. Dim oType As Type = Nothing  
  9. Dim strSource As String = _  
  10.     "Public Class MainClass " + vbCrLf + _  
  11.     "   Public Shared Function Eval() As Integer" + vbCrLf + _  
  12.     "      Return 3 + 4" + vbCrLf + _  
  13.     "   End Function" + vbCrLf + _  
  14.     "End Class"  
  15. oCParams.CompilerOptions = "/t:library"  
  16. oCParams.GenerateInMemory = True  
  17.   
  18. oCResults = oCodeProvider.CompileAssemblyFromSource(oCParams, strSource)  
  19.   
  20. If oCResults.Errors.Count <> 0 Then  
  21.     MsgBox("Error")  
  22. End If  
  23. oAssy = oCResults.CompiledAssembly  
  24.   
  25. 'oExecInstance = oAssy.CreateInstance("MainClass")  
  26. 'oType = oExecInstance.GetType  
  27. 'oMethodInfo = oType.GetMethod("Eval")  
  28. 'oRetObj = oMethodInfo.Invoke(oExecInstance, Nothing)  
  29.   
  30. oType = oAssy.GetType("MainClass")  
  31. oRetObj = oType.InvokeMember("Eval", BindingFlags.InvokeMethod, NothingNothingNothing)  
  32. MsgBox("method 2: " & CStr(oRetObj))  

 

 

C#

[c-sharp]
 
  1. var exp = "3 + (2 + 3)/5";  
  2. var csCodeProvider = new CSharpCodeProvider();  
  3. var csParams = new CompilerParameters();  
  4. var source = "public class MainClass { public static object Eval() { return (#exp#); } }";  
  5. source = source.Replace("#exp#", exp);  
  6. csParams.CompilerOptions = "/t:library";  
  7. csParams.GenerateInMemory = true;  
  8.   
  9. var csResults = csCodeProvider.  
  10.                 CompileAssemblyFromSource(csParams, source);  
  11. if (csResults.Errors.Count > 0)  
  12. {  
  13.     Console.WriteLine(csResults.Errors[0].ToString());  
  14.     return;  
  15. }  
  16.   
  17. var ass = csResults.CompiledAssembly;  
  18. var type = ass.GetType("MainClass");  
  19. var result = type.InvokeMember("Eval", BindingFlags.InvokeMethod,   
  20.                                 nullnullnull);  
  21.   
  22. Console.WriteLine("{0} = {1}", exp, result);  

 

 

方法三: DataColumn.Expression & DataTable.Compute方法。

VB.NET

[vb]
 
  1. Dim dt As DataTable = New DataTable  
  2. dt.Columns.Add("Val1"GetType(Integer))  
  3. dt.Columns.Add("Val2"GetType(Integer))  
  4. dt.Columns.Add("Result").Expression = String.Format("Val1 + Val2"Me.TextBox1.Text)  
  5.   
  6. dt.Rows.Add(New Object() {3, 4})  
  7.   
  8. MsgBox("method 3: " & dt.Rows(0)("Result"))  

 

C#

[c-sharp]
 
  1. var exp = "3 + (2 + 3)/5";  
  2. DataTable dt = new DataTable();  
  3. dt.Columns.Add("Result").Expression = exp;  
  4. dt.Rows.Add(dt.NewRow());  
  5.   
  6. var result = dt.Rows[0]["Result"];  
  7.   
  8. Console.WriteLine("{0} = {1}", exp, result);  

转载于:https://www.cnblogs.com/senyier/p/3498570.html

你可能感兴趣的文章
2019阿里云开年Hi购季基础云产品分会场分会场全攻略!
查看>>
十年再出发:阿里云智能战略加速的“四级火箭”
查看>>
IIS7.5 错误代码0x8007007e HTTP 错误 500.19 - Internal Server Error
查看>>
189. Rotate Array - LeetCode
查看>>
java获取redis的日志信息和动态监控信息
查看>>
另类port-security配置
查看>>
2011年城市年终奖排行榜前十名
查看>>
软件安装boss:yum
查看>>
7,mysql视图
查看>>
常用的adb指令a
查看>>
jquery插件hotkeys捕捉键盘事件
查看>>
五指cms来源管理
查看>>
小论C++函数对象在STL算法函数中的应用
查看>>
linux开机启动流程
查看>>
我的友情链接
查看>>
分享java微信开发视频
查看>>
部署web项目错误
查看>>
阿里云引擎ACE 试用笔记
查看>>
ROS设置普通用户权限
查看>>
SQL 多行合并成一行
查看>>