Esempio n. 1
0
        public static List <T> ApplyFilterMember <T>(string[] args, out int argsUsed, StringArgParser changeType, List <T> current, object relativeTo, bool removeMatches, OutputDelegate warn, bool negative, char compareChar, CompareTestChar compareObjects, FilterMember fmemb)
        {
            object arg1 = null;

            if (fmemb.CastArgTo != null)
            {
                int      len1     = args.Length - 1;
                string[] destargs = new string[len1];
                Array.Copy(args, 1, destargs, 0, len1);
                int argsUsedLocal;
                arg1     = changeType(destargs, out argsUsedLocal, fmemb.CastArgTo);
                argsUsed = 1 + argsUsedLocal;
            }
            else
            {
                argsUsed = 1;
            }
            List <T>   putInto = new List <T>();
            Action <T> WhenTrue;

            if (negative)
            {
                putInto.AddRange(current);
                WhenTrue = (o) => putInto.Remove(o);
            }
            else
            {
                WhenTrue = (o) => putInto.Add(o);
            }
            foreach (T i in current)
            {
                object posresult = fmemb.Function(i, arg1, relativeTo);
                if (fmemb.PreCompare)
                {
                    posresult = compareObjects(compareChar, posresult, arg1);
                }
                if (fmemb.IsCollectionType)
                {
                    if (typeof(T).IsInstanceOfType(posresult))
                    {
                        WhenTrue((T)posresult);
                        continue;
                    }
                    var ie = (IEnumerable)posresult;
                    foreach (var item in ie)
                    {
                        WhenTrue((T)item);
                    }
                    continue;
                }
                else
                {
                    if ((bool)posresult)
                    {
                        WhenTrue(i);
                    }
                }
            }
            return(putInto);
        }
Esempio n. 2
0
        public static List <T> ApplyFilter <T>(string[] args, out int argsUsed, StringArgParser changeType, List <T> current,
                                               object relativeTo, bool removeMatches, OutputDelegate warn, CompareTestChar compareTestChar)
        {
            if (current.Count == 0)
            {
                argsUsed = args.Length;
                return(current);
            }
            var    example     = current[0];
            Type   exampleType = example.GetType();
            string arg0Lower   = args[0];
            bool   negative    = removeMatches;

            if (arg0Lower.StartsWith("!"))
            {
                negative  = !negative;
                arg0Lower = arg0Lower.Substring(1);
            }
            int  predAt      = arg0Lower.IndexOfAny("<>=*".ToCharArray());
            char compareChar = '=';

            if (predAt > 1)
            {
                compareChar = arg0Lower[predAt];
                arg0Lower   = arg0Lower.Substring(predAt);
            }
            var possible = FindFiltersForTarget(arg0Lower, example, relativeTo, warn);

            if (possible == null || possible.Count == 0)
            {
                throw new ParserFilterFormatException(arg0Lower, args, 0);
            }
            foreach (FilterMember member in possible)
            {
                return(ApplyFilterMember(args, out argsUsed, changeType, current, relativeTo,
                                         removeMatches, warn, negative, compareChar, compareTestChar, member));
            }
            throw new ParserFilterFormatException(arg0Lower, args, 0);
        }