using System; using System.Collections; using System.Collections.Generic; using System.Reflection; namespace Bro.Common.Procedure { /// /// IO数据状态 /// public enum IODStat { IODSUndo, IODSDoing, IODSDone, } /// /// IO数据基类 /// public class IODataBase { #region 常量 // 默认的输入处理函数名称 public const string DFT_HANDLE_METHOD_NAME = "HandleRequest"; #endregion #region 属性 // 消息处理者 public List Handlers {get;set;} public IODStat Stat { get { return curStat; }} // 消息描述 public string Desp { get;set; } // 创建时间 public DateTime CreateTime { get;set; } // 处理开始时间 public DateTime BeginTime { get;set; } // 处理完成时间 public DateTime EndTime { get;set; } // 用户数据 public object Data { get;set; } #endregion #region 成员变量 private IODStat curStat = IODStat.IODSUndo; #endregion #region 结构体 public IODataBase() { Handlers = null; curStat = IODStat.IODSUndo; CreateTime = DateTime.Now; BeginTime = DateTime.MinValue; EndTime = DateTime.MinValue; Desp = this.GetType().ToString(); Data = null; } public IODataBase(List handlers, string desp, object userData) { Handlers = handlers; curStat = IODStat.IODSUndo; CreateTime = DateTime.Now; BeginTime = DateTime.MinValue; EndTime = DateTime.MinValue; this.Desp = desp; this.Data = userData; } #endregion #region 方法 /// /// 派遣函数,利用反射机制自动派遣给输入处理者 /// /// 处理方法 /// 1. 遍历数据处理者 /// 2. 检察处理者中是否有指定名称函数 /// 3. 检察此函数参数,与数返回值据类型一致 /// 4. 利用反射调用函数 /// 5. 返回值为true,则处理结束 /// public void Dispatch() { var paramType = this.GetType(); var objParams = new object[1]; objParams[0] = this; if ( null == Handlers ) { return; } foreach(var handler in Handlers) { if ( null == handler ) { continue; } // 获取参数类型 var instType = handler.GetType(); do { var instMthInfos = instType.GetMethods( BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic ); var findsMthInfos = FindMethods(instMthInfos, paramType.Name); foreach (var item in findsMthInfos) { var mth = (MethodInfo)item; // 调用对应实例方法 var ret = (bool)mth.Invoke(handler, objParams); if (ret) { return; } } instType = instType.BaseType; } while (instType != null); } } private Array FindMethods(MethodInfo[] mthInfos, string paramType) { var findMethods = new ArrayList(); foreach (var instMth in mthInfos) { var paramInfos = instMth.GetParameters(); // 防止调用父类函数 //if ( instType != instMth.DeclaringType ) //{ // continue; //} // 参数个数检查 if (paramInfos.Length != 1) { continue; } // 方法必须是指定名称 if (DFT_HANDLE_METHOD_NAME.CompareTo(instMth.Name) != 0) { continue; } // 参数类型检查 if (paramInfos[0].ParameterType.Name.CompareTo(paramType) != 0) { continue; } // 方法返回值检察 if (instMth.ReturnType.Name.CompareTo(typeof(bool).Name) != 0) { continue; } findMethods.Add(instMth); } return findMethods.ToArray(); } #endregion } }