有些財務系統的計算方式,若能開放給User微調定義,可以增加很多彈性。透過C#的Reflection及Type機制,可以實作運算式的Eval()計算。眾多開源Lib控件裏,我覺得DynamicExpresso寫得最好,架構如下圖:
可惜它僅支援單一行的表達式Expression, 要實作邏輯if-else或區域變數的定義,就力有不逮了。後來改用CS-Script這套C# Script引擎,因為它的對象是整個Script,而非在單一表達式運算上,因此在變數定義沒有DynamicExpresso直覺,需要一些巧思才能實作成下圖的方式。
值得一提的是,這類使用Reflection及產生CodeDom的即時運算要注意其效能消耗。以CS-Script v3.8.10為例,初始化要700ms,載入Script並Compile編譯要80ms,應用在批次大量計算時,要特別注意寫法。
No comments:
Post a Comment