gpt4 book ai didi

c# - 泛型——我可以基于变量编写 T 吗?

转载 作者:太空宇宙 更新时间:2023-11-03 19:17:53 24 4
gpt4 key购买 nike

我正在编写一个游戏,我有一个 Crate 类,其中包含因箱子而异的类型 T 的项目。我用这样的泛型设置了它:

public class Crate<I> : Item 
where I : Item
{
private List<I> contents = new List<I>();
//...
}

我目前正在编写一个“购买”屏幕,您可以在其中选择元素,然后将这些元素的 crate 交付。根据玩家在游戏中所处的阶段,某些元素可用/不可用。因此,我有一个数组中当前可用项目的列表。

我想做的是基于该数组创建 Crates。

例如,我的数组可能是

    public static List<Item> CurrentlyAvailableItems= new List<Item>() { new Linen(), new Food() };

从这里开始,我想创建按钮来生成这些项目的 crate 。目前我能想到的唯一方法是使用一个巨大的 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>>或类似的东西。

关于c# - 泛型——我可以基于变量编写 T 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14827992/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com