Как мне создать переменную такого же типа C#?

у меня есть небольшая иерархия классов:

class Item {
    int count;
}

class UsableItem : Item {
    public void OnUse() {}
}

class ComponentItem : Item {}

и есть массив (инвентарь), содержащий различные объекты типов UsableItem и ComponentItem, т.е. разные.

List<Item> inventory;

Я хочу перенести определённое кол-во предметов из одного инвентаря в другой

int item_count = 22;
int item_index = 3;

inventory_from[item_index].count -= item_count

// И вот тут мне нужно создать объект такого же класса
// как и inventory_from[item_index] и засунуть в другой инвентарь

Как мне это сделать?


Ответы (2 шт):

Автор решения: InterceptorTSK
    var ListA = new System.Collections.Generic.List<Item>(); // Items from
    var ListB = new System.Collections.Generic.List<Item>(); // Items copy/clone to
    ListA.Add(new Item());
    ListA.Add(new Item());
    ListA.Add(new UsableItem());
    ListA.Add(new UsableItem());
    ListA.Add(new ComponentItem());
    ListA.Add(new ComponentItem());

    for (int i = 0; i < ListA.Count; i++)
    {
        Item item = ListA[i];
        System.Type itemType = item.GetType();

        //System.Console.WriteLine(itemType); // All types here

        if (itemType == typeof(Item))
        {
            System.Console.WriteLine("Create and copy/clone Item");

            // New reference[newItem] and new object
            Item newItem = new Item();

            // Clone/copy old item to new()

            // Add reference[newItem] to ListB
            ListB.Add(newItem);
        }
        else if (itemType == typeof(UsableItem))
        {
            System.Console.WriteLine("Create and copy/clone UsableItem");

            // New reference[newUsableItem] and new object
            UsableItem newUsableItem = new UsableItem();

            // Clone/copy old item to new()

            // Add reference[newUsableItem] to ListB
            ListB.Add(newUsableItem);
        }
        else if (itemType == typeof(ComponentItem))
        {
            System.Console.WriteLine("Create and copy/clone ComponentItem");

            // New reference[newComponentItem] and new object
            ComponentItem newComponentItem = new ComponentItem();

            // Clone/copy old item to new()

            // Add reference[newComponentItem] to ListB
            ListB.Add(newComponentItem);
        }
        else
            throw new System.NotSupportedException(itemType.ToString());
    }
→ Ссылка
Автор решения: Андрей Туманов

В базовом классе Item создаем виртуальный метод makeCopy который должен возвращать объект-наследник от Item

В потомках перекрываем этот метод и создаем объект нужного типа. Копируем туда данные и возвращаем этот объект.

Все.

var ListA = new System.Collections.Generic.List<Item>(); // Items from
var ListB = new System.Collections.Generic.List<Item>(); // Items copy/clone to
ListA.Add(new Item());
ListA.Add(new Item());
ListA.Add(new UsableItem());
ListA.Add(new UsableItem());
ListA.Add(new ComponentItem());
ListA.Add(new ComponentItem());

for (int i = 0; i < ListA.Count; i++)
{
    Item item = ListA[i];
    ListB.Add(item.makeCopy());
}
→ Ссылка