/// <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); //} }
/// <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); }
public TypeDescription(Type type) { Type = type; Items = new ItemDescriptions(); Properties = new PropertyDescriptions(); Methods = new MethodDescriptions(); }
/// <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); } } }