public static WarehouseBuildItemRequest FromSprite(Sprite sprite, int column, int row) { var item = new WarehouseBuildItemRequest { column = column, row = row }; var behavior = AttributeExtensions.GetAssemblyTypes <SpriteAttribute>() .FirstOrDefault(x => x.attribute.Name == sprite.name || x.attribute.NamePattern.IsValid() && sprite.name.Contains(x.attribute.NamePattern)) .type; if (behavior != null) { item.itemType = behavior.ToString(); return(item); } else { // let's try to match on enum-types var enumSprites = AttributeExtensions.GetAssemblyEnumMembers <SpriteAttribute>(); var enumMatch = enumSprites.FirstOrDefault(x => x.matches.AsNotNull().Any(y => y.attributes.AsNotNull().Any(z => (z as SpriteAttribute)?.Name == sprite.name))); if (enumMatch.matches.HasItems()) { var enumType = enumMatch.enumType; var(enumName, attributes) = enumMatch.matches.First(x => x.attributes.Any(y => (y as SpriteAttribute)?.Name == sprite.name)); var spriteAttr = (SpriteAttribute)attributes.First(x => (x as SpriteAttribute).Name == sprite.name); switch (spriteAttr.Key) { case Marker.DefaultSpriteKey: item.markerType = (BoxType)Enum.Parse(enumType, enumName); break; case Box.DefaultSpriteKey: item.boxType = (BoxType)Enum.Parse(enumType, enumName); break; default: throw new NotImplementedException($"Can't resolve PlaceItem from '{spriteAttr.Key}' (sprite: {sprite?.name})."); } return(item); } } throw new ArgumentException($"Couldn't PlaceItem for sprite '{sprite?.name}'."); }