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);

但是当我确实需要将其用作类型时,它会导致"变量用作类型"错误。当然不是可变的,而是它的价值。

C# 类型的变量.(变量)

首先,除非你有两个名为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);
}

这里的想法应该是不要让任何东西知道ItemEquipItem(或任何旧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
    }
}