泛型-我可以根据变量写T吗
本文关键字:变量 我可以 泛型 | 更新日期: 2023-09-27 17:58:42
我正在写一个游戏,我有一个Crate类,它包含不同板条箱的T类型的Items。我用Generics设置了这个:
public class Crate<I> : Item
where I : Item
{
private List<I> contents = new List<I>();
//...
}
我目前正在写一个"购买"屏幕,你可以在屏幕上选择商品,然后一箱箱的商品就会被交付。根据玩家在游戏中所处的阶段,某些物品是/不可用的。因此,我有一个数组中当前可用项目的列表。
我想做的是基于这个数组创建Crates。
例如,我的数组可能是
public static List<Item> CurrentlyAvailableItems= new List<Item>() { new Linen(), new Food() };
从这里,我想创建按钮来生成这些项目的板条箱。目前,我唯一能想到的方法是使用一个巨大的IF循环,每次我创建这样的新项目时都需要更新:
for (int i = 0; i < GV.CurrentlyAvailableItems.Count; i++)
{
Item item = null;
if (GV.CurrentlyAvailableItems[i] is Linen) item = new Crate<Linen>();
else if (GV.CurrentlyAvailableItems[i] is Food) item = new Crate<Food>();
Add(new BuyButton(item));
}
我想做的是:
for (int i = 0; i < GV.CurrentlyAvailableItems.Count; i++)
{
Type t = GV.CurrentlyAvailableItems[i].GetType();
Crate<t> crate = new Crate<t>();
Add(new BuyButton(crateToBuy ));
}
这可能吗?
您可以使用反射:
// TODO: Consider using a foreach loop over GC.CurrentlyAvailableItems
Type itemType = GV.CurrentlyAvailableItems[i].GetType();
Type crateType = typeof(Crate<>).MakeGenericType(t);
Item crate = (Item) Activator.CreateInstance(crateType);
Add(new BuyButton(crate));
请注意,这个不会非常高效,但可能已经足够好了。如果不是,您可能想要Dictionary<Type, Func<Item>>
或类似的东西。
如果每个派生类型只有几个,则可以使用动态关键字和函数重载,或者使用反射(请参阅Jon Skeet的答案):
BuyButton CreateButton(MyDerivedItem foo)
{
return new BuyButton(Crate<MyDerivedItem>());
}
// ... and in your code:
Add(CreateButton((dynamic)(GV.CurrentlyAvailableItems[i])));