Как мне создать переменную такого же типа 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());
}