예제 #1
0
        ///<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);
        }