namespace ConsoleApplication { using System; using System.Linq; using System.Reflection; using System.Collections.Generic; using Microshaoft; public class Class1 { static void Main(string[] args) { string formula = "(({0}-{1})/{2}+{3})*{4}"; string result = JScriptEvaluator.ComputeFormula<double> ( formula , 1f , 2.1 , 3.1 , 4.0 , 5.0 ); Console.WriteLine(result); double x; x = DataTableColumnExpression.ComputeFormula<double, double> ( formula , 1f , 2.1 , 3.1 , 4.0 , 5.0 ); Console.WriteLine(x); //================================================================================================= formula = "IIF(1=2, F1, F2) + ((--F1) * F2) + F3"; Dictionary<string, int> dict = new Dictionary<string, int>(); dict.Add("F1", 2); dict.Add("F2", 3); dict.Add("F3", 4); x = DataTableColumnExpression.ComputeFormula<double, int>(formula, dict); Console.WriteLine(x); Console.ReadLine(); } } } namespace Microshaoft { using System; using System.Data; using System.Linq; using System.Collections.Generic; using System.Reflection; using System.CodeDom.Compiler; public class DataTableColumnExpression { private static MethodInfo _mi = typeof(string).GetMethods().First ( m => m.Name.Equals("Format") && m.GetParameters().Length == 2 && m.IsStatic && m.GetParameters()[1].Name == "args" ); public static TResult ComputeFormula<TResult, TParameter>(string formula, params TParameter[] parameters) { var dt = new DataTable(); var list = parameters.ToList(); var parametersName = new List<string>(); ; int i = 0; list.ForEach ( parameter => { //string f = string.Format("{{{0}}}", i++); string f = string.Format("F{0}", i++); parametersName.Add(f); var dc = new DataColumn(f, typeof(TParameter)); dt.Columns.Add(dc); } ); object[] ps = new object[parameters.Length]; Array.Copy(parametersName.ToArray(), 0, ps, 0, ps.Length); string expression = (string) _mi.Invoke ( null , new object[] { formula , ps } ); dt.Columns.Add(new DataColumn("Microshaoft", typeof(TResult), expression)); var dr = dt.NewRow(); i = 0; list.ForEach ( parameter => { dr[i++] = parameter; } ); dt.Rows.Add(dr); return (TResult) dr["Microshaoft"]; } public static TResult ComputeFormula<TResult, TParameter>(string formula, IDictionary<string, TParameter> parameters) { var dt = new DataTable(); var list = parameters.ToList(); list.ForEach ( kvp => { var dc = new DataColumn(kvp.Key, typeof(TParameter)); dt.Columns.Add(dc); } ); dt.Columns.Add(new DataColumn("Microshaoft", typeof(TResult), formula)); var dr = dt.NewRow(); list.ForEach ( kvp => { dr[kvp.Key] = kvp.Value; } ); dt.Rows.Add(dr); return (TResult) dr["Microshaoft"]; } } public class JScriptEvaluator { private static MethodInfo _mi = typeof(string).GetMethods().First ( m => m.Name.Equals("Format") && m.GetParameters().Length == 2 && m.IsStatic && m.GetParameters()[1].Name == "args" ); public static string ComputeFormula<TParameter>(string formula, params TParameter[] parameters) { object[] ps = new object[parameters.Length]; Array.Copy(parameters.ToArray(), 0, ps, 0, ps.Length); string expression = (string) _mi.Invoke ( null , new object[] { formula , ps } ); return (string) JScriptEvaluator.Eval(expression); } public static object Eval(string statement) { return _evaluatorType.InvokeMember ( "Eval" , BindingFlags.InvokeMethod , null , _evaluator , new object[] { statement } ); } static JScriptEvaluator() { CodeDomProvider provider = CodeDomProvider.CreateProvider("JScript"); CompilerParameters parameters; parameters = new CompilerParameters(); parameters.GenerateInMemory = true; CompilerResults results; results = provider.CompileAssemblyFromSource(parameters, _JScript); Assembly assembly = results.CompiledAssembly; _evaluatorType = assembly.GetType("Microshaoft.JScriptEvaluator"); _evaluator = Activator.CreateInstance(_evaluatorType); } private static object _evaluator = null; private static Type _evaluatorType = null; /// <summary> /// JScript代码 /// </summary> private static readonly string _JScript = @" package Microshaoft { class JScriptEvaluator { public function Eval(statement : String) : String { return eval(statement); } } } "; } } |