zoukankan      html  css  js  c++  java
  • 表达式计算 DataTable/DataRow/DataColumn Expression、JScript CodeDomProvider Eval

    
    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);
                            }
                        }
                    }
                ";
        }
    }
    
    
  • 相关阅读:
    内置对象
    Angular 动画
    Angular_上拉刷新
    angular Observable
    【Nginx】nginx为目录或网站加上密码认证
    MongoDB笔记
    websocket服务器+客户端
    cli 中php的配置和phpinfo不一样
    linux设置时区和自动同步时间
    crontab & php实现多进程思路
  • 原文地址:https://www.cnblogs.com/Microshaoft/p/2376194.html
Copyright © 2011-2022 走看看