.Net实现表达式计算(公式) 表达式字符串
2013-12-30 22:37
190 查看
文档原址:/article/1408176.html
实现复杂公式计算,比如含IF分支判断等,可考虑通过调用EXCEL公式获取值。
Excel公式计算参考:/article/6011426.html
方法一: MSScriptControl.ScriptControl
VB.NET
[vb] view plaincopy
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#
[c-sharp] view plaincopy
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
[vb] view plaincopy
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#
[c-sharp] view plaincopy
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
[vb] view plaincopy
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#
[c-sharp] view plaincopy
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);
实现复杂公式计算,比如含IF分支判断等,可考虑通过调用EXCEL公式获取值。
Excel公式计算参考:/article/6011426.html
方法一: MSScriptControl.ScriptControl
VB.NET
[vb] view plaincopy
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#
[c-sharp] view plaincopy
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
[vb] view plaincopy
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#
[c-sharp] view plaincopy
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
[vb] view plaincopy
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#
[c-sharp] view plaincopy
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(表达式是字符串的计算)
- JAVA实现的可以带参数的公式表达式计算
- 利用API 实现字符串表达式的计算
- java实现计算字符串表达式
- .NET 实现Eval(文字列表达式计算)的3种实现方法。
- [转]用Objective-C实现简单的数学字符串公式的计算
- C#中实现字符串表达式计算
- 给定一个字符串表达式s,计算其值(使用string和stack实现)
- php中通过eval实现字符串格式的计算公式
- 【.Net码农】C#中字符串转换为计算公式
- 利用ScriptEngineManager实现字符串公式灵活计算
- 利用ScriptEngineManager实现字符串公式灵活计算的方法
- 【JAVA】通过公式字符串表达式计算值,网上的一种方法
- 利用API 实现字符串表达式的计算
- 取得一个字符串表达式的计算结果(实现方法二)
- 取得一个字符串表达式的计算结果(实现方法一)
- java基于mesp计算和实现数学公式、数学表达式
- 现有字符串形式的算术表达式,求计算其值。
- 自己实现的一个公式表达式解析
- java实现中缀表达式转后缀表达式并且计算