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

时间:2016-01-20 16:47:07

标签: c# types

我有一系列项目:

Item[] ItemsOut;

问题是我有一些派生类型Item,如EquipItem。他们也在这个阵列中。

AddItemItem类都有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);

但是当我需要将它用作类型时,它会导致“变量用作类型”错误。当然不是变数,而是它的价值。

2 个答案:

答案 0 :(得分:1)

这里的想法应该是不要让任何事情知道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
    }
}

答案 1 :(得分:1)

首先,除非你有两个名为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]等类型名称进行投射

最后,除非您遇到性能问题,否则请不要尝试优化代码。这样做就是我们所说的Premature Optimization

因此,请检查您是否有方法AddItem(EquipItem 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);
}