博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一个表达式计算类

Posted on 2007-07-06 11:40  Johnson Cao  阅读(286)  评论(0)    收藏  举报
我曾经为一个HR系统写过一个工资计算的辅助类的草稿,
现在发出来给大家看看!
这个代码只是我的初稿,最终在HR中怎么使用我就不知道了,因为HR不是我写的!
但就下面简单的Test里实现的功能已经可以使用!
  1using System;
  2using System.Collections.Generic;
  3using System.Text;
  4using System.Text.RegularExpressions;
  5using System.CodeDom;
  6using System.CodeDom.Compiler;
  7using System.Reflection;
  8using Microsoft.CSharp;
  9
 10namespace WindowsApplication3
 11{
 12    /// <summary>
 13    /// 表达式辅助类
 14    /// </summary>

 15    public class ExpressionHelper : IDisposable
 16    {
 17#if DEBUG
 18        public static object Test()
 19        {
 20            using (ExpressionHelper helper = new ExpressionHelper("[基本工资]+([职级工资]/[出勤天数]+100)*[出勤天数]/[行事历天数]+年龄([职级工资]+[岗位工资]+年龄(10))"))
 21            {
 22                helper.AddMethod("年龄"@"if ( [部门]==[部门.JAVA部门])
 23
 24return 100;
 25}  
 26else if( [部门]==[部门.部门测试] && [年假] >= 8)  
 27{
 28return [年假]*比率; 
 29
 30else
 31{
 32return 200; 
 33}"typeof(int), new ParameterInfo("比率"typeof(int)));
 34                return helper.Execute().ToString();
 35            }

 36        }

 37#endif
 38        private AppDomain m_Domain;
 39        private ExpressionExecute m_Execute;
 40
 41        private Dictionary<stringobject> m_Properties;
 42        private Dictionary<string, Dictionary<stringobject>> m_Consts;
 43        private string m_Expression;
 44        private const string Pattern = @"\[(@)?(.+?)(\.(.+?))?\]";
 45
 46        /// <summary>
 47        /// 表达式中所使用的属性如'[基本工资]'
 48        /// </summary>

 49        public Dictionary<stringobject> Properties
 50        {
 51            get return m_Properties; }
 52        }

 53
 54        /// <summary>
 55        /// 表达式中所使用的常量Id如'[部门.DotNet部门]'
 56        /// </summary>

 57        public Dictionary<string, Dictionary<stringobject>> Consts
 58        {
 59            get return m_Consts; }
 60        }

 61
 62        public ExpressionHelper(string expression)
 63        {
 64            m_Properties = new Dictionary<stringobject>();
 65            m_Consts = new Dictionary<string, Dictionary<stringobject>>();
 66            m_Expression = expression;
 67            InitVariable();
 68            m_Domain = AppDomain.CreateDomain("ExpressionExecute" + Guid.NewGuid().ToString());
 69
 70            foreach (Assembly ass in AppDomain.CurrentDomain.GetAssemblies())
 71                try
 72                {
 73                    m_Domain.Load(ass.FullName);
 74                }

 75                catch { }
 76            m_Execute = m_Domain.CreateInstanceFromAndUnwrap(typeof(ExpressionExecute).Assembly.Location, typeof(ExpressionExecute).FullName) as ExpressionExecute;
 77        }

 78
 79        /// <summary>
 80        /// 初始化常量和变量列表
 81        /// </summary>

 82        private void InitVariable()
 83        {
 84            // TODO: 需要修改此方法,进行初始化数据,如加载个人信息.常量(如部门,学历等)
 85            Guid id = Guid.NewGuid();
 86            Properties.Add("部门", id);
 87            Properties.Add("年假"10);
 88            Properties.Add("基本工资"1000);
 89            Properties.Add("职级工资"1000);
 90            Properties.Add("出勤天数"23);
 91            Properties.Add("行事历天数"10);
 92            Properties.Add("岗位工资"2000);
 93            Consts.Add("部门"new Dictionary<stringobject>());
 94<span style="
在线帮助MSN:flyaqiao@hotmail.com
技术支持: KiteSupport@gmail.com
Copyright (c) 2006 KiteSoft, All Rights Reserved.