private static bool PropertyCompare(string[] conditionTable, ConditionData compareObj) { Type _type = compareObj.GetType(); FieldInfo[] _fieldInfoArr = _type.GetFields(); List <bool> orList = new List <bool>(); List <bool> andList = new List <bool>(); for (int i = 0; i < conditionTable.Length; i++) { if (conditionTable[i] == CHAR_TAG_IGNORE) { continue; } object _compareParam = _fieldInfoArr[i].GetValue(compareObj); SubCompareResult _compare = SpecificCompare(conditionTable[i], _compareParam, _fieldInfoArr[i]); switch (_compare.logicTag) { case LogicalOperator.And: andList.Add(_compare.result); break; case LogicalOperator.Or: orList.Add(_compare.result); break; } } if ((orList == null || orList.Count <= 0) && (andList == null || andList.Count <= 0)) { return(false); } for (int i = 0; i < andList.Count; i++) { if (!andList[i]) { return(false); } } bool _or = false; for (int i = 0; i < orList.Count; i++) { if (orList[i]) { _or = true; } } return(_or); }
private static SubCompareResult SpecificCompare(string tableParam, object compareParam, FieldInfo fieldInfo) { SubCompareResult _resultInfo = new SubCompareResult(); string paramName = fieldInfo.Name; bool _result = false; if (paramName.Contains(COMPARE_TAG_RANGE)) //在數值範圍內 { string[] _range = tableParam.Split(SPLIT_TAG_RANGE); int _min = (int)ConvertData(_range[0], typeof(int)); int _max = (int)ConvertData(_range[1], typeof(int)); int _value = (int)compareParam; _result = (_min <= _value) && (_value <= _max); } else if (paramName.Contains(COMPARE_TAG_GREATERTHEN)) //大於指定數值 { int _param = (int)ConvertData(tableParam, typeof(int)); int _value = (int)compareParam; _result = (_value >= _param); } else if (paramName.Contains(COMPARE_TAG_SMALLERTHAN)) //小於指定數值 { int _param = (int)ConvertData(tableParam, typeof(int)); int _value = (int)compareParam; _result = (_value <= _param); } else if (paramName.Contains(COMPARE_TAG_CONTAIN)) //包含指定值 { IList _param = (IList)ConvertData(tableParam, fieldInfo.FieldType, true); _result = _param.Contains(compareParam); } else //未指定的狀況, 檢查是否相等 { object _param = ConvertData(tableParam, fieldInfo.FieldType); _result = _param.Equals(compareParam); } _resultInfo.result = _result; if (paramName.Contains(LOGICAL_TAG_AND)) //加入"AND"邏輯判斷清單 { _resultInfo.logicTag = LogicalOperator.And; } else //加入"OR"邏輯判斷清單 { _resultInfo.logicTag = LogicalOperator.Or; } return(_resultInfo); }