.NET 实现Eval(文字列表达式计算)的3种实现方法。
2010-11-07 00:34
573 查看
本文就像讨论孔以己讨论“回”字有几种一样属于水文,高手请跳过~~
方法一: MSScriptControl.ScriptControl
VB.NET
C#
方法二: CodeDOM
VB.NET
C#
方法三: DataColumn.Expression & DataTable.Compute方法。
VB.NET
C#
方法一: MSScriptControl.ScriptControl
VB.NET
Dim exp As String = "3 + 4" Dim t As Type = Type.GetTypeFromProgID("MSScriptControl.ScriptControl") Dim obj As Object = Activator.CreateInstance(t) t.InvokeMember("Language", System.Reflection.BindingFlags.SetProperty, _ Nothing, obj, New Object() {"vbscript"}) Dim result As Object = t.InvokeMember("Eval", System.Reflection.BindingFlags.InvokeMethod, _ Nothing, obj, New Object() {exp}) MsgBox("method 1: " & CStr(result))
C#
var exp = "3 + (2 + 3)/5"; var type = Type.GetTypeFromProgID("MSScriptControl.ScriptControl"); var obj = Activator.CreateInstance(type); type.InvokeMember("Language", BindingFlags.SetProperty, null, obj, new object[] { "javascript" }); var result = type.InvokeMember("Eval", BindingFlags.InvokeMethod, null, obj, new object[] { exp }); Console.WriteLine("{0} = {1}", exp, result);
方法二: CodeDOM
VB.NET
Dim oCodeProvider As VBCodeProvider = New VBCodeProvider Dim oCParams As CompilerParameters = New CompilerParameters Dim oCResults As CompilerResults = Nothing Dim oAssy As System.Reflection.Assembly = Nothing Dim oExecInstance As Object = Nothing Dim oRetObj As Object = Nothing Dim oMethodInfo As MethodInfo = Nothing Dim oType As Type = Nothing Dim strSource As String = _ "Public Class MainClass " + vbCrLf + _ " Public Shared Function Eval() As Integer" + vbCrLf + _ " Return 3 + 4" + vbCrLf + _ " End Function" + vbCrLf + _ "End Class" oCParams.CompilerOptions = "/t:library" oCParams.GenerateInMemory = True oCResults = oCodeProvider.CompileAssemblyFromSource(oCParams, strSource) If oCResults.Errors.Count <> 0 Then MsgBox("Error") End If oAssy = oCResults.CompiledAssembly 'oExecInstance = oAssy.CreateInstance("MainClass") 'oType = oExecInstance.GetType 'oMethodInfo = oType.GetMethod("Eval") 'oRetObj = oMethodInfo.Invoke(oExecInstance, Nothing) oType = oAssy.GetType("MainClass") oRetObj = oType.InvokeMember("Eval", BindingFlags.InvokeMethod, Nothing, Nothing, Nothing) MsgBox("method 2: " & CStr(oRetObj))
C#
var exp = "3 + (2 + 3)/5"; var csCodeProvider = new CSharpCodeProvider(); var csParams = new CompilerParameters(); var source = "public class MainClass { public static object Eval() { return (#exp#); } }"; source = source.Replace("#exp#", exp); csParams.CompilerOptions = "/t:library"; csParams.GenerateInMemory = true; var csResults = csCodeProvider. CompileAssemblyFromSource(csParams, source); if (csResults.Errors.Count > 0) { Console.WriteLine(csResults.Errors[0].ToString()); return; } var ass = csResults.CompiledAssembly; var type = ass.GetType("MainClass"); var result = type.InvokeMember("Eval", BindingFlags.InvokeMethod, null, null, null); Console.WriteLine("{0} = {1}", exp, result);
方法三: DataColumn.Expression & DataTable.Compute方法。
VB.NET
Dim dt As DataTable = New DataTable dt.Columns.Add("Val1", GetType(Integer)) dt.Columns.Add("Val2", GetType(Integer)) dt.Columns.Add("Result").Expression = String.Format("Val1 + Val2", Me.TextBox1.Text) dt.Rows.Add(New Object() {3, 4}) MsgBox("method 3: " & dt.Rows(0)("Result"))
C#
var exp = "3 + (2 + 3)/5"; DataTable dt = new DataTable(); dt.Columns.Add("Result").Expression = exp; dt.Rows.Add(dt.NewRow()); var result = dt.Rows[0]["Result"]; Console.WriteLine("{0} = {1}", exp, result);
相关文章推荐
- c#中实现类似js的Eval|.NET中执行Javascript(表达式是字符串的计算)
- 取得一个字符串表达式的计算结果(实现方法二)
- .net连接oracle的3种实现方法
- 计算表达式的值c++逆波兰式实现方法
- 【.Net码农】Asp.Net异常:"由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值"的解决方法
- .net连接oracle的3种实现方法
- .Net实现表达式计算(公式) 表达式字符串
- .net连接oracle的3种实现方法
- 【Java】斐波那契数列(Fibonacci Sequence、兔子数列)的3种计算方法(递归实现、递归值缓存实现、循环实现、尾递归实现)
- 3种方法实现UILabel的左上角对齐显示文字
- 取得一个字符串表达式的计算结果(实现方法一)
- 使用XtraReport的CalculatedFiled(计算字段)实现RDLC报表中表达式
- 罗马数字的计算方法和利用python实现其转换(1)
- 计算方法双点截弦法matlab实现
- 用 C++ 实现的加、减、乘、除表达式计算
- Android中实现定时器的3种解决方法
- javascript下利用数组缓存正则表达式的实现方法
- 通过入栈出栈实现数学表达式的计算
- php文字水印和php图片水印实现代码(二种加水印方法)
- 不用ajax实现点击文字即可编辑的方法