public FilterElementPredicate <T> AppendChildPredicate(FilterElement filterEl) { FilterElementPredicateFactory <T> factory = new FilterElementPredicateFactory <T>(); FilterElementPredicate <T> childPredicate = factory.Create <FilterElementPredicate <T> >(filterEl); if (childPredicate != null) { ChildPredicates.Add(childPredicate); } return(childPredicate); }
private static void ConstructPredicate(FilterElementPredicate <DateTime> predicate, FilterElementCollection filterColl, string sourceName) { foreach (FilterElement filterEl in filterColl) { if (filterEl.HasChildElements) { //Создаем блок predicate = predicate.AppendChildPredicate(filterEl); //рекурсивно обрабатываем дочерние фильтры ConstructPredicate(predicate, filterEl.ChildElements, sourceName); } if (filterEl.Source == sourceName) { predicate.AppendChildPredicate(filterEl); } } }
FilterElementPredicate <T> IFactoryMethod <FilterElementPredicate <T> > .Create(object obj) { FilterElementPredicate <T> retVal = null; FilterElement filterEl = obj as FilterElement; if (filterEl != null) { if (filterEl.Type == FilterElementType.AndBlock) { retVal = new AndBlockFilterElementPredicate <T>(); foreach (FilterElement childFilterEl in filterEl.ChildElements) { retVal.AppendChildPredicate(childFilterEl); } } if (filterEl.Type == FilterElementType.OrBlock) { retVal = new OrBlockFilterElementPredicate <T>(); foreach (FilterElement childFilterEl in filterEl.ChildElements) { retVal.AppendChildPredicate(childFilterEl); } } else { IComparable <T> filterValue = TryConvertFilterValue(filterEl.Value) as IComparable <T>; if (filterValue != null) { Func <T, bool> functor = null; switch (filterEl.Type) { case FilterElementType.Equal: functor = delegate(T obj1) { return(filterValue.CompareTo(obj1) == 0); }; break; case FilterElementType.NotEqual: functor = delegate(T obj1) { return(filterValue.CompareTo(obj1) != 0); }; break; case FilterElementType.Less: functor = delegate(T obj1) { return(filterValue.CompareTo(obj1) > 0); }; break; case FilterElementType.LessOrEqual: functor = delegate(T obj1) { return(filterValue.CompareTo(obj1) >= 0); }; break; case FilterElementType.Greater: functor = delegate(T obj1) { return(filterValue.CompareTo(obj1) < 0); }; break; case FilterElementType.GreaterOrEqual: functor = delegate(T obj1) { return(filterValue.CompareTo(obj1) <= 0); }; break; } if (functor != null) { retVal = new FilterElementPredicate <T>(filterEl, functor); } } } } return(retVal); }