您的位置:首页 > 移动开发 > Objective-C

.NET 实现Eval(文字列表达式计算)的3种实现方法。

2010-11-07 00:34 573 查看
本文就像讨论孔以己讨论“回”字有几种一样属于水文,高手请跳过~~

 

方法一: 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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息