コード例 #1
0
    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}'.");
    }