/// <summary>
        /// Echange la position de deux items par réflexion
        /// </summary>
        /// <param name=""></param>
        /// <param name=""></param>
        public static void ExchangeItems(InventorySlot src, InventorySlot dest)
        {
            if (src == null || dest == null)
                return;

            BindingFlags reflectionFlags = BindingFlags.Instance | BindingFlags.Public;
            InventorySlot tempDest = new InventorySlot(dest.IsEmpty, dest.Item, dest.Amount, dest.Type);

                // Slot destinataire rempli avec les données du slot source
            dest.GetType().GetProperty("IsEmpty", reflectionFlags).SetValue(dest, src.IsEmpty, null);
            dest.GetType().GetProperty("Item", reflectionFlags).SetValue(dest, src.Item, null);
            dest.GetType().GetProperty("Amount", reflectionFlags).SetValue(dest, src.Amount, null);
            dest.GetType().GetProperty("Type", reflectionFlags).SetValue(dest, src.Type, null);

                // Slot source rempli avec les données du slot destinataire gardées temporairement
            src.GetType().GetProperty("IsEmpty", reflectionFlags).SetValue(src, tempDest.IsEmpty, null);
            src.GetType().GetProperty("Item", reflectionFlags).SetValue(src, tempDest.Item, null);
            src.GetType().GetProperty("Amount", reflectionFlags).SetValue(src, tempDest.Amount, null);
            src.GetType().GetProperty("Type", reflectionFlags).SetValue(src, tempDest.Type, null);
        }
        /// <summary>
        /// A partir de deux références, copie les propriétés d'un slot vers un autre par réflexion
        /// </summary>
        /// <param name="src"></param>
        /// <param name="dest"></param>
        /// <param name="isToMerge"> Si mis à vrai, rassembler deux même objets dans une seule stack</param>
        public static void MoveOrMergeItem(InventorySlot src, InventorySlot dest, bool isToMerge)
        {
            if (src == null || dest == null)
                return;

            BindingFlags reflectionFlags = BindingFlags.Instance | BindingFlags.Public;

            dest.GetType().GetProperty("IsEmpty", reflectionFlags).SetValue(dest, src.IsEmpty, null);
            dest.GetType().GetProperty("Item", reflectionFlags).SetValue(dest, src.Item, null);
            dest.GetType().GetProperty("Amount", reflectionFlags).SetValue(dest, src.Amount + (isToMerge ? dest.Amount : 0) , null);
            dest.GetType().GetProperty("Type", reflectionFlags).SetValue(dest, src.Type, null);

                // le slot source est réinitialisé
            src.GetType().GetProperty("IsEmpty", reflectionFlags).SetValue(src, true, null);
            src.GetType().GetProperty("Item", reflectionFlags).SetValue(src, new Item(), null);
            src.GetType().GetProperty("Amount", reflectionFlags).SetValue(src, 0, null);
            src.GetType().GetProperty("Type", reflectionFlags).SetValue(src, 0, null);
        }
        /// <summary>
        /// Créée un nouvel item associé au slot destinataire et répartie la quantité totale sur le slot source et celui-ci (par réflexion)
        /// </summary>
        /// <param name="src"></param>
        /// <param name="dest"></param>
        public static void SeparateItemStack(InventorySlot src, InventorySlot dest)
        {
            if (src.Amount < 2 || src == null || dest == null)
                return;

            BindingFlags reflectionFlags = BindingFlags.Instance | BindingFlags.Public;

            PropertyInfo pi = dest.GetType().GetProperty("IsEmpty", reflectionFlags);
            pi.SetValue(dest, src.IsEmpty, null);

            pi = dest.GetType().GetProperty("Item", reflectionFlags);
            pi.SetValue(dest, src.Item, null);

            pi = dest.GetType().GetProperty("Amount", reflectionFlags);
            pi.SetValue(dest, src.Amount/2, null);

            pi = dest.GetType().GetProperty("Type", reflectionFlags);
            pi.SetValue(dest, src.Type, null);

            src.GetType().GetProperty("Amount", reflectionFlags).SetValue(src, src.Amount / 2 + ((src.Amount % 2 == 0) ? 0 : 1), null);
        }
        /// <summary>
        /// Remplit les tableau de slots d'emplacements vides
        /// </summary>
        public static void InitSlotsTable()
        {
            for (int i = 0; i < SLOTS_NBR; i++)
            {
                slots[i] = new InventorySlot();
            }

            for (int i = 0; i < SHORTCUTSLOTS_NBR; i++)
                shorcutSlots[i] = new InventorySlot();
        }