У меня есть массив элементов:C# тип переменной. (Переменная)
Item[] ItemsOut;
Проблема в том, у меня есть некоторые производные типы Item
, как EquipItem
. Они тоже в этом массиве.
У меня есть функция AddItem
для обоих классов Item
и EquipItem
.
Inventory.AddItem(AllRecipes.Recipes[curPage].ItemsOut[i]......);
Идея заключается в том, что в случае, если мой массив типа Item[]
поэтому всегда добавлять элементы, такие как нормальный Item
.
Мое текущее решение работает, и это:
if (AllRecipes.Recipes[curPage].ItemsOut[i].GetType() == typeof(EquipItem))
{
Inventory.AddItem((EquipItem)AllRecipes.Recipes[curPage].ItemsOut[i], AllRecipes.Recipes[curPage].ItemsOut[i].number);
}
else
{
Inventory.AddItem(AllRecipes.Recipes[curPage].ItemsOut[i], AllRecipes.Recipes[curPage].ItemsOut[i].number);
}
Но если у меня есть 100500 ребенка классы я буду вынужден делать 100500 if
заявления.
Как сделать это автоматическим? Что-то вроде:
Inventory.AddItem((AllRecipes.Recipes[curPage].ItemsOut[i].GetType())AllRecipes.Recipes[curPage].ItemsOut[i], AllRecipes.Recipes[curPage].ItemsOut[i].number);
или
Inventory.AddItem(AllRecipes.Recipes[curPage].ItemsOut[i] as AllRecipes.Recipes[curPage].ItemsOut[i].GetType(), AllRecipes.Recipes[curPage].ItemsOut[i].number);
Я хотел бы быть в состоянии сделать что-то вроде:
Type t = AllRecipes.Recipes[curPage].ItemsOut[i].GetType();
Inventory.AddItem((t)AllRecipes.Recipes[curPage].ItemsOut[i].number);
Но это вызывает «переменную, используемую в качестве типа» ошибка, когда Мне НЕОБХОДИМО использовать его как тип. Конечно, не переменная, а ее ценность.
Почему вы литье вообще? Что делает 'AddItem (EquipItem)' по-разному 'AddItem (Item) '? –
В общем, то, что вы пытаетесь сделать, - это просто то, что система типа C# не особенно хорошо подходит для обработки. См. [Эту серию статей] (http://ericlippert.com/2015/04/27/wizards-and-warriors-part-one/) по теме, которая углубляется в объяснение, почему это проблема, что некоторые из решений являются, и почему ни один из них не особенно велик (в C# в любом случае). – Servy
AddItem (EquipItem) добавляет элемент и делает его equipable, nonstackable, e.t.c. Когда AddItem (Item) делает его обычным элементом. Большое спасибо за статьи. И, кстати, эта работа модератора просто потрясающая, я очень ее ценю. –