Beispiel #1
0
        /// <summary>
        /// Finalizes the instance.
        /// </summary>
        public void Flush()
        {
            // Set references to this object
            Compound.Instance = this;
            foreach (var instanceElement in
                     Bots.AsEnumerable <InstanceElement>()
                     .Concat(Pods.AsEnumerable <InstanceElement>())
                     .Concat(Elevators.AsEnumerable <InstanceElement>())
                     .Concat(InputStations.AsEnumerable <InstanceElement>())
                     .Concat(OutputStations.AsEnumerable <InstanceElement>())
                     .Concat(Waypoints.AsEnumerable <InstanceElement>())
                     .Concat(ItemDescriptions.AsEnumerable <InstanceElement>())
                     .Concat(ItemBundles.AsEnumerable <InstanceElement>()))
            {
                instanceElement.Instance = this;
            }

            //TODO:why is the code below commented out??

            //// Generate Waypointgraph
            //WaypointGraph = new WaypointGraph();
            //foreach (var waypoint in Waypoints)
            //{
            //    WaypointGraph.Add(waypoint);
            //}
        }
Beispiel #2
0
        /// <summary>
        /// Creates an abstract item description for an item of the specified type.
        /// </summary>
        /// <param name="id">The ID of the item description.</param>
        /// <param name="itemType">The type of the item.</param>
        /// <returns>An abstract item description.</returns>
        public ItemDescription CreateItemDescription(int id, ItemType itemType)
        {
            ItemDescription item = null;

            switch (itemType)
            {
            case ItemType.Letter: { item = new ColoredLetterDescription(this); } break;

            case ItemType.SimpleItem: { item = new SimpleItemDescription(this); } break;

            default: throw new ArgumentException("Unknown item type: " + itemType.ToString());
            }
            item.ID       = id;
            item.Instance = this;
            ItemDescriptions.Add(item);
            // Determine volatile ID
            int volatileID = 0;

            while (_volatileItemDescriptionIDs.Contains(volatileID))
            {
                volatileID++;
            }
            item.VolatileID = volatileID;
            _volatileItemDescriptionIDs.Add(item.VolatileID);
            // Maintain actual ID
            if (_idToItemDescription.ContainsKey(item.ID))
            {
                throw new ArgumentException("Already have an item with this ID: " + id);
            }
            _idToItemDescription[item.ID] = item;
            return(item);
        }
Beispiel #3
0
 public TypeDescription(Type type)
 {
     Type       = type;
     Items      = new ItemDescriptions();
     Properties = new PropertyDescriptions();
     Methods    = new MethodDescriptions();
 }
Beispiel #4
0
 /// <summary>
 /// Registers and returns a new ID for an object of the given type.
 /// </summary>
 /// <returns>A new unique ID that can be used to identify the object.</returns>
 public int RegisterItemDescriptionID()
 {
     if (ItemDescriptions.Any() && _itemDescriptionID <= ItemDescriptions.Max(e => e.ID))
     {
         _itemDescriptionID = ItemDescriptions.Max(e => e.ID) + 1;
     }
     return(_itemDescriptionID++);
 }
        /// <summary>
        /// See base docs.
        /// </summary>
        /// <param name="disposing"></param>
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (ItemDescriptions != null)
                {
                    ItemDescriptions.Dispose();
                    ItemDescriptions.Clear();
                    ItemDescriptions = null;
                }
            }

            base.Dispose(disposing);
        }
        public static void ReflectProperties(
            Type targetType,
            PropertyDescriptions propertyDescriptions,
            ItemDescriptions itemDescriptions,
            WoopsaConverters customValueTypeConverters = null)
        {
            PropertyInfo[] properties;
            if (!targetType.IsInterface)
            {
                properties = targetType.GetProperties(BindingFlags.Public | BindingFlags.Instance);
            }
            else
            {
                properties = (new Type[] { targetType }).Concat(targetType.GetInterfaces()).SelectMany(i => i.GetProperties()).ToArray();
            }
            foreach (var propertyInfo in properties)
            {
                WoopsaValueTypeAttribute attribute = GetCustomAttribute <WoopsaValueTypeAttribute>(propertyInfo);

                bool isValidWoopsaProperty = false;
                isValidWoopsaProperty = InferWoopsaType(customValueTypeConverters, propertyInfo.PropertyType,
                                                        out WoopsaValueType woopsaPropertyType,
                                                        out WoopsaConverter converter);
                if (attribute != null)
                {
                    woopsaPropertyType    = attribute.ValueType;
                    isValidWoopsaProperty = true;
                }
                if (isValidWoopsaProperty)
                {
                    //This property is a C# property of a valid basic Woopsa Type, it can be published as a Woopsa property
                    PropertyDescription newPropertyDescription = new PropertyDescription(
                        woopsaPropertyType, propertyInfo,
                        !propertyInfo.CanWrite || propertyInfo.GetSetMethod(false) == null,
                        converter);
                    propertyDescriptions.Add(newPropertyDescription);
                }
                else if (!propertyInfo.PropertyType.IsValueType)
                {
                    // This property is not of a WoopsaType, if it is a reference type, assume it is an inner item
                    ItemDescription newItem = new ItemDescription(propertyInfo);
                    itemDescriptions.Add(newItem);
                }
            }
        }