需求提出
在業務系統的應用中,常需要定義計算公式。如:工資計算、設備折舊計算、招投標報價等。這些計算方案有一定的規律性,但對於目標客戶而言,又是非常個性化,設計並實現一個簡單、易用、配置性強的公式計算方案,是業務系統平台的一個重要的基礎功能。
目前很多業務系統實現的公式定義很多,功能也非常復雜、基本算術運算、統計公式,參數化定義等,應有盡有。這類公式定義器需要自己也很多的方法與功能,用來實現公式的動態編輯並校驗公式的正確性。本文提出的一種公式計算方法,是針對有基礎技術技能(懂C#語法)的簡單應用解決方法,它直接使用.Net動態編譯技術來實現,公式的校驗與公式的解析執行非常簡單,供大家學習參考。
基本原理基本原理就是.Net動態即時編譯技術。動態編譯就是指在運行時動態生成類源代碼,執行編譯過程,返回編譯後的結果類,並執行類的相關操作。目前,動態即時編譯技術應用非常多,Java,.Net,JS腳本都支持動態編譯。典型的如:JavaScript中有名的 eval方法,直接將參數中的字符串編譯為可執行的方法,執行,並返回結果。
使用C#動態編譯的主要代碼如下:
ICodeCompiler complIEr = (new CSharpCodeProvider().CreateCompiler());
// 設置編譯參數。
CompilerParameters paras = new CompilerParameters();
paras.GenerateExecutable = false;
paras.GenerateInMemory = true;
// 動態創建代碼。
StringBuilder classSrc = new StringBuilder();
classSrc.Append("public class "+ className +"\n");
…… 構造類源碼結構
// 編譯代碼。
CompilerResults result = complIEr.CompileAssemblyFromSource(paras, classSrc.ToString());
// 獲取編譯後的程序集。
Assembly assembly = result.CompiledAssembly;
// 動態調用方法。
object eval = assembly.CreateInstance(className);
MethodInfo method = eval.GetType().GetMethod(methodName);
object reobj = method.Invoke(eval, null);
return reobj;