C# 类型的变量.(变量)
本文关键字:变量 类型 | 更新日期: 2023-09-27 18:31:07
我有一组项目:
Item[] ItemsOut;
问题是我有一些派生类型Item
,比如EquipItem
。它们也在这个数组中。
我有一个Item
类和EquipItem
类的AddItem
函数。
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的方法(一个用于Item,另一个用于EquipItem),否则你不需要强制转换你的ItemsOut,只需使用 Inventory.AddItem(AllRecipes.Recipes[curPage].ItemsOut[i], AllRecipes.Recipes[curPage].ItemsOut[i].number);
其次,你不能这样做:
Type t = AllRecipes.Recipes[curPage].ItemsOut[i].GetType();
addItem((t)AllRecipes.Recipes[curPage].ItemsOut[i]
因为 t
是类Type
的实例,所以只能使用类型名称进行强制转换,如(EquipItem) AllRecipes.Recipes[curPage].ItemsOut[i]
最后,除非遇到性能问题,否则永远不要尝试优化代码。这样做就是我们所说的过早优化
因此,请检查您是否有方法AddItem(EquipItem equipItem)
。如果没有,则无需检查其类型并将物品投射到装备物品。希望我能帮到你。
编辑 我认为可以改进您的代码的最好的事情是清除它,如下所示:
var item = AllRecipes.Recipes[curPage].ItemsOut[i];
if (item is EquipItem)
{
Inventory.AddItem((EquipItem) item, item.number);
}
else
{
Inventory.AddItem(item, item.number);
}
这里的想法应该是不要让任何东西知道Item
,EquipItem
(或任何旧FooItem
)之间的区别。
如果它们都派生自Item
并且数组类型化为 Item[]
那么这些子类可以毫无问题地添加到数组中
var item = new Item();
var equip = new EquipItem(); // where EquipItem inherits from Item;
var array = new Item[]{ item,equipItem}; // no error here
如果你有一个AddItem
方法,它添加到这个数组中并根据类型执行一些操作,那么调用代码应该不知道关于该类型的任何信息 - 也许是一些虚拟方法,它在添加到列表时执行一些操作
public class Item
{
public virtual void AddedToList(){}
}
public class EquipItem
{
public override void AddedToList()
{
// behaviour specific to EquipItem
}
}