例如 :(1+1)==2 回傳結果true
(1+1)>=2
(1+1)*(2+2)=8
uj5u.com熱心網友回復:
直接動態編譯執行一下uj5u.com熱心網友回復:
這個要寫幾百行代碼,我自己就寫過一個腳本解釋器。實際上這個需要構建一個運算式樹,比如“(8*9+6)”可以看成一個樹,這個樹有兩個樹枝,第一根樹枝是"8*9",第二根樹枝是“6”。第一根樹枝又能延伸出兩根樹枝,第二根樹枝不能再延伸。這個有點類似于Windows檔案夾的結構。 通過字串構建好樹之后,然后開始遍歷樹,實際上這個就是遍歷檔案夾一個道理,遍歷的程序進行值的累積。uj5u.com熱心網友回復:
不就是你寫的這樣嗎。uj5u.com熱心網友回復:
直接代碼里寫啊,你想表達啥沒太懂意思uj5u.com熱心網友回復:
你的意思是要做一個計算器嗎uj5u.com熱心網友回復:
DataTable.Comput()方法uj5u.com熱心網友回復:
動態編譯... 類似js的eval
var cmd="alert('');";
eval(cmd);
.net里研究過一次 好像很復雜 就沒后續了....
uj5u.com熱心網友回復:
動態編譯是有點復雜uj5u.com熱心網友回復:
CSharpCodeProvider。 把字串表達式當成代碼執行就行了。uj5u.com熱心網友回復:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("請輸入腳本以回車結束:");
var expr = Console.ReadLine();
var asm = CreateAssembly(expr);
var cls = asm.CreateInstance("CY.Test.MyClass");//Namespace+ ClassName
var type = asm.GetType("CY.Test.MyClass");
var method = type.GetMethod("Run");
var val = method.Invoke(cls, null);
Console.WriteLine($"{val},type is {val.GetType()}");
Console.ReadKey();
}
private static Assembly CreateAssembly(string expr)
{
var provider = new CSharpCodeProvider();
var cp = new CompilerParameters();
cp.GenerateExecutable = false;
cp.GenerateInMemory = true;
var source = GetCSString(expr);
Console.WriteLine(source);
var cr = provider.CompileAssemblyFromSource(cp, source);
if (!cr.Errors.HasErrors)
{
return cr.CompiledAssembly;
}
return null;
}
private static string GetCSString(string expr)
{
var sb = new StringBuilder();
sb.AppendLine("using System;");
sb.AppendLine("namespace CY.Test{");
sb.AppendLine("public class MyClass{");
sb.AppendLine(" public object Run(){");
sb.AppendLine($" return {expr};");
sb.AppendLine(" }");
sb.AppendLine("}");
sb.AppendLine("}");
return sb.ToString();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/8437.html
標籤:C#
