///<summary> /// Проверяется, подходит ли элемент под фильтр ///</summary> ///<param name="item">Проверяемый элемент</param> ///<returns>Результат - подходит ли элемент</returns> public bool Acceptable(BaseEntityObject item) { if (item == null || FilterProperty == null || Values.Length == 0) { return(true); } PropertyInfo typeProp; if ((typeProp = item.GetType().GetProperty(FilterProperty.Name)) == null || !FilterProperty.PropertyType.Name.Equals(typeProp.PropertyType.Name)) { return(true); } if (FilterProperty.PropertyType.Name.ToLower() != "string" && FilterProperty.PropertyType.GetInterface(typeof(IEnumerable <>).Name) != null) { //Если свойство не string (string реализует интерфейс IEnumerable<>) //и реализует интерфейс IEnumerable<> то //производится поиск параметра универсального типа Type t = FilterProperty.PropertyType; while (t != null) { if (t.IsGenericType) { t = t.GetGenericArguments().FirstOrDefault(); break; } t = t.BaseType; } if (t == null) { return(false); } if (t.Name != typeof(T).Name) { return(false); } } else if (FilterProperty.PropertyType.Name != typeof(T).Name) { return(false); } object propertyValue = FilterProperty.GetValue(item, null); if (propertyValue == null) { return(false); } //Тип свойства реалтзует интерфейс IEnumerable if (FilterProperty.PropertyType.Name.ToLower() != "string" && FilterProperty.PropertyType.GetInterface(typeof(IEnumerable <>).Name) != null) { IEnumerable <T> convertedPropertyValue = ((IEnumerable <T>)propertyValue).ToArray(); if (!convertedPropertyValue.Any()) { return(false); } switch (FilterType) { case FilterType.Equal: return(convertedPropertyValue.Contains(Values[0])); case FilterType.NotEqual: return(!convertedPropertyValue.Contains(Values[0])); case FilterType.In: return(convertedPropertyValue.Any(cpv => Values.Contains(cpv))); //return Values.Any(v => convertedPropertyValue.Contains(v)); default: return(false); } } //Проверка, является ли переданный тип наследником BaseSmartCoreObject if (FilterProperty.PropertyType.IsSubclassOf(typeof(AbstractDictionary)) || FilterProperty.PropertyType.IsSubclassOf(typeof(StaticDictionary))) { switch (FilterType) { case FilterType.Equal: return(propertyValue.Equals(Values[0])); case FilterType.NotEqual: return(!propertyValue.Equals(Values[0])); case FilterType.In: return(Values.Any(v => propertyValue.Equals(v))); default: return(false); } } if (FilterProperty.PropertyType.GetInterface(typeof(IBaseEntityObject).Name) != null) { switch (FilterType) { case FilterType.Equal: return(propertyValue.Equals(Values[0])); case FilterType.NotEqual: return(!propertyValue.Equals(Values[0])); case FilterType.In: return(Values.Any(v => propertyValue.Equals(v))); default: return(false); } } if (FilterProperty.PropertyType.Name == typeof(Lifelength).Name) { Lifelength convertedPropertyValue = (Lifelength)propertyValue; Lifelength convertedFilterValue = Values[0] as Lifelength ?? Lifelength.Null; switch (FilterType) { case FilterType.Less: return(convertedPropertyValue.IsLessIgnoreNulls(convertedFilterValue)); case FilterType.LessOrEqual: return(convertedPropertyValue.IsLessOrEqualByAnyParameter(convertedFilterValue)); case FilterType.Equal: return(convertedPropertyValue.Equals(convertedFilterValue)); case FilterType.GratherOrEqual: return(convertedPropertyValue.IsGreaterOrEqualByAllParameters(convertedFilterValue)); case FilterType.Grather: return(convertedPropertyValue.IsGratherIgnoreNulls(convertedFilterValue)); case FilterType.NotEqual: return(!convertedPropertyValue.Equals(convertedFilterValue)); case FilterType.In: return(Values.OfType <Lifelength>().Any(convertedPropertyValue.Equals)); default: return(false); } } if (FilterProperty.PropertyType.IsEnum) { switch (FilterType) { case FilterType.Equal: return(Equals(propertyValue, Values[0])); case FilterType.NotEqual: return(!Equals(propertyValue, Values[0])); case FilterType.In: { return(Values.Any(value => Equals(value, propertyValue))); } default: return(false); } } string typeName = FilterProperty.PropertyType.Name.ToLower(); switch (typeName) { case "bool": case "boolean": { bool convertedPropertyValue = Convert.ToBoolean(propertyValue); bool convertedFilterValue = Convert.ToBoolean(Values[0]); switch (FilterType) { case FilterType.Equal: return(convertedPropertyValue == convertedFilterValue); case FilterType.NotEqual: return(convertedPropertyValue != convertedFilterValue); case FilterType.In: return(Values.Any(v => convertedFilterValue == Convert.ToBoolean(v))); default: return(false); } } case "datetime": { DateTime convertedPropertyValue = Convert.ToDateTime(propertyValue); DateTime convertedFilterValue = Convert.ToDateTime(Values[0]); switch (FilterType) { case FilterType.Less: return(convertedPropertyValue < convertedFilterValue); case FilterType.LessOrEqual: return(convertedPropertyValue <= convertedFilterValue); case FilterType.Equal: return(convertedPropertyValue == convertedFilterValue); case FilterType.GratherOrEqual: return(convertedPropertyValue >= convertedFilterValue); case FilterType.Grather: return(convertedPropertyValue > convertedFilterValue); case FilterType.NotEqual: return(convertedPropertyValue != convertedFilterValue); case FilterType.In: return(Values.Any(v => convertedFilterValue == Convert.ToDateTime(v))); case FilterType.Between: return(Convert.ToDateTime(Values[0]) <= convertedPropertyValue && convertedPropertyValue <= Convert.ToDateTime(Values[1])); default: return(false); } } case "double": { double convertedPropertyValue = Convert.ToDouble(propertyValue); double convertedFilterValue = Convert.ToDouble(Values[0]); switch (FilterType) { case FilterType.Less: return(convertedPropertyValue < convertedFilterValue); case FilterType.LessOrEqual: return(convertedPropertyValue <= convertedFilterValue); case FilterType.Equal: return(convertedPropertyValue == convertedFilterValue); case FilterType.GratherOrEqual: return(convertedPropertyValue >= convertedFilterValue); case FilterType.Grather: return(convertedPropertyValue > convertedFilterValue); case FilterType.NotEqual: return(convertedPropertyValue != convertedFilterValue); case FilterType.In: return(Values.Any(v => convertedFilterValue == Convert.ToDouble(v))); default: return(false); } } case "int16": { Int16 convertedPropertyValue = Convert.ToInt16(propertyValue); Int16 convertedFilterValue = Convert.ToInt16(Values[0]); switch (FilterType) { case FilterType.Less: return(convertedPropertyValue < convertedFilterValue); case FilterType.LessOrEqual: return(convertedPropertyValue <= convertedFilterValue); case FilterType.Equal: return(convertedPropertyValue == convertedFilterValue); case FilterType.GratherOrEqual: return(convertedPropertyValue >= convertedFilterValue); case FilterType.Grather: return(convertedPropertyValue > convertedFilterValue); case FilterType.NotEqual: return(convertedPropertyValue != convertedFilterValue); case FilterType.In: return(Values.Any(v => convertedFilterValue == Convert.ToInt16(v))); default: return(false); } } case "int32": { Int32 convertedPropertyValue = Convert.ToInt32(propertyValue); Int32 convertedFilterValue = Convert.ToInt32(Values[0]); switch (FilterType) { case FilterType.Less: return(convertedPropertyValue < convertedFilterValue); case FilterType.LessOrEqual: return(convertedPropertyValue <= convertedFilterValue); case FilterType.Equal: return(convertedPropertyValue == convertedFilterValue); case FilterType.GratherOrEqual: return(convertedPropertyValue >= convertedFilterValue); case FilterType.Grather: return(convertedPropertyValue > convertedFilterValue); case FilterType.NotEqual: return(convertedPropertyValue != convertedFilterValue); case FilterType.In: return(Values.Any(v => convertedFilterValue == Convert.ToInt32(v))); default: return(false); } } case "string": { string convertedPropertyValue = propertyValue.ToString().Trim().ToLower(); //для строкового фильтра в FilterType.Equal и FilterType.NotEqual //проверяются все значения switch (FilterType) { case FilterType.Equal: return(Values.Select(v => new Pattern(v.ToString().Trim().ToLower(), true, true)).All(p => p.IsMatch(convertedPropertyValue))); case FilterType.NotEqual: return(!Values.Select(v => new Pattern(v.ToString().Trim().ToLower(), true, true)).Any(p => p.IsMatch(convertedPropertyValue))); case FilterType.In: return(Values.Select(v => new Pattern(v.ToString().Trim().ToLower(), true, true)).Any(p => p.IsMatch(convertedPropertyValue))); default: return(false); } } } return(true); }