コード例 #1
0
 private object ConvertType00(object o, Type type)
 {
     if (type == typeof(TimeSpan))
     {
         double seconds;
         if (double.TryParse("" + o, out seconds))
         {
             return(TimeSpan.FromSeconds(seconds));
         }
     }
     if (FilterSpecAttribute.IsAssignableFrom(typeof(SimObject), type))
     {
         return(AsSimObject(o));
     }
     if (FilterSpecAttribute.IsAssignableFrom(typeof(Primitive), type))
     {
         return(AsSimObject(o).Prim);
     }
     if (FilterSpecAttribute.IsAssignableFrom(typeof(UUID), type))
     {
         SimObject nullCheck = AsSimObject(o);
         if (nullCheck == null)
         {
             return(null);
         }
         return(nullCheck.ID);
     }
     if (o is IConvertible)
     {
         if (typeof(IConvertible).IsAssignableFrom(type))
         {
             try
             {
                 return(Convert.ChangeType(o, type));
             }
             catch
             {
             }
         }
     }
     return(ConfigSettingAttribute.FindValueOfType(o, type, 2));
 }
コード例 #2
0
 public IEnumerable <FilterMember> GetFilters(Type type)
 {
     return(FilterSpecAttribute.GetFilters(type));
 }
コード例 #3
0
        public List <SimObject> GetUnionArg(string[] args, out int argsUsed, List <SimObject> prims,
                                            ref bool isIntersection,
                                            bool negated, MixinSubObjects relativeTo, out bool negateNext)
        {
            string arg0Lower = args[0].ToLower();

            negateNext = false;

            if (arg0Lower == "!")
            {
                negateNext = true;
                argsUsed   = 1;
                return(prims);
            }

            int used = 0;

            // Negation
            if (arg0Lower == "not")
            {
                prims    = GetUnionExprsn(Parser.SplitOff(args, 1), out used, prims, !negated, relativeTo);
                argsUsed = 1 + used;
                return(prims);
            }
            else if (arg0Lower == "or" || arg0Lower == "concat")
            {
                var secondSet = StartGetUnionExprsn(Parser.SplitOff(args, 1), out used);
                prims.AddRange(secondSet);
                argsUsed = used;
                return(prims);
            }
            if (arg0Lower == "[")
            {
                var secondSet = StartGetUnionExprsn(Parser.SplitOff(args, 1), out used);
                argsUsed = 1 + used;
                return(JoinLists(prims, negated, isIntersection, secondSet));
            }
            if (arg0Lower == "+")
            {
                var secondSet = GetSingleArg(Parser.SplitOff(args, 1), out used);
                argsUsed = 1 + used;
                return(JoinLists(prims, negated, false, secondSet));
            }
            if (arg0Lower == "keep" || arg0Lower == "max")
            {
                int nth;
                used++;
                if (int.TryParse(args[1], out nth))
                {
                    used++;
                }
                int keep = Math.Abs(nth);
                if (keep > prims.Count)
                {
                    keep = prims.Count;
                }
                if (negated)
                {
                    keep = prims.Count - keep;
                }

                int removeCount = prims.Count - keep;

                if (nth > 0)
                {
                    // keep the first few
                    prims.RemoveRange(keep, removeCount);
                }
                else
                {
                    // keep the last few
                    prims.RemoveRange(0, removeCount);
                }
                argsUsed = used;
                return(prims);
            }
            else if (arg0Lower == "nth")
            {
                used++;
                int nth = 0;
                if (int.TryParse(args[1], out nth))
                {
                    used++;
                }
                if (!negated)
                {
                    List <SimObject> prims0 = new List <SimObject>();
                    if (prims.Count >= nth)
                    {
                        prims0.Add(prims[nth - 1]);
                    }
                    prims = prims0;
                }
                else
                {
                    prims = new List <SimObject>(prims);
                    prims.RemoveAt(nth);
                }
                argsUsed = used;
                return(prims);
            }
            else if (arg0Lower == "bydist")
            {
                used++;
                List <SimObject> objs = new List <SimObject>();
                AsPrimitives(objs, prims);
                objs.Sort(((SimObject)relativeTo).CompareDistance);
                if (negated)
                {
                    objs.Reverse();
                }
                prims    = objs;
                argsUsed = used;
                return(prims);
            }
            else if (arg0Lower == "distfrom")
            {
                relativeTo = GetSimObjectS(Parser.SplitOff(args, 1), out used);
                used++;
                List <SimObject> objs = new List <SimObject>();
                AsPrimitives(objs, prims);
                objs.Sort(((SimObject)relativeTo).CompareDistance);
                if (negated)
                {
                    objs.Reverse();
                }
                prims    = objs;
                argsUsed = used;
                return(prims);
            }
            else if (arg0Lower == "reverse")
            {
                used++;
                prims.Reverse();
                argsUsed = used;
                return(prims);
            }
            else
            {
                bool nonFilter =
                    arg0Lower.StartsWith("$") ||
                    arg0Lower.StartsWith("@") ||
                    arg0Lower.StartsWith("primid") ||
                    arg0Lower.Substring(1).Contains("-");

                ParserFilterFormatException missingFilter = null;
                if (!nonFilter)
                {
                    // filters will re-namgate so use the incoming "removeMatches"
                    int usedF;
                    try
                    {
                        return(FilterSpecAttribute.ApplyFilter(args, out argsUsed, ChangeType,
                                                               prims, relativeTo,
                                                               negated, Debug, CompareObjectsChar));
                    }
                    catch (ParserFilterFormatException pff)
                    {
                        missingFilter = pff;
                    }
                }
                List <SimObject> rcol = GetSingleArg(args, out argsUsed);
                if (rcol != null)
                {
                    return(JoinLists(prims, negated, isIntersection, rcol));
                }
                else
                {
                    if (missingFilter != null)
                    {
                        argsUsed = 0;
                        // what saort of erro should we make?
                        Debug("no such filter or object: " + arg0Lower);
                        throw missingFilter;
                    }
                }
            }
            return(prims);
        }