静态列表中的项目<Item>()

Items in static List<Item>()

所以我有一个静态项目列表,其中存储了一些 classes,在那些 classes 中是变量,例如 "int ID"、"string name"、"string description"、"int currentAmount"、等等

ItemDatabase.cs...

public static List<Item> Items

static void LoadItemData()
{
    Items.Add(new item);
    ...
}

然后我有一个单独的项目列表,其中将添加项目供玩家使用。

Player.cs...

List<Item> playerItems;

然后在其他 classes 中,我有 AddItem(int ID) 方法:

void AddItem(int id)
{
    foreach (Item i in ItemDatabase.Items)
        if (i.ID == id)
            playerItems.Add(i);
}

我目前正在添加将使用相同数据的实体。但是当我修改添加到 playerItems 的 Item 时,它会修改 ItemDatabase.Items(显然,由于引用)。

我无法将项目 class 变成结构,因为我还有其他 class 派生自它。 我需要 "currentAmount" 整数按值计算。有什么办法可以做到这一点吗?

P.S.,我已经尝试过深度克隆,但它与我的项目 class.

配合不佳

你需要分开currentAmount。由于该值仅在 Player 无论如何 的上下文中才有意义,我会将其从 Item class 中取出并使用 Dictionary<Item,int> 跟踪库存:

Dictionary<Item, int> inventory = new Dictionary<Item, int>();

void AddItem(int id)
{
    foreach (Item i in ItemDatabase.Items)
        if (i.ID == id)
            playerItems.Add(i, 0); //Or whatever count
}

我仍然不确定你在哪里修改 ItemsDatabase.Items(实体的 属性 的 currentAmount 没有多大意义),但是对于你库存中的当前数量,我想这将帮助您:

Dictionary<Item, int> inventory = new Dictionary<Item, int>();

void AddItem(int id)
{
    foreach (Item i in ItemDatabase.Items)
        if (i.ID == id)
            {
              if(!inventory.Keys.Contains(i)){iventory.Add(i, 0);}
              inventory[i]+=1; //increment the amount of items in inventory.
            }
}

重要:

Dictionary 使用 Hash 从字典中获取对象,因此,您可能希望在 Item 中覆盖该方法 class:

class Item {
    public string Name;
    public string Description;
    public int currentAmount;

    public override int GetHashCode(){
       return Name.GetHashCode() + Description.GetHashCode();
    }
}

查看更多:

这样做:

void AddItem(int id)
{
    var item = ItemDatabase.Items.FirstOrDefault(x=> x.ID == id);
    if(item!=null){
        playerItems.Add(new Item(){ ID = item.ID, Name = item.Name, etc... })
    }
}

显然,如果要在不影响原始对象的情况下更改对象,则需要克隆对象。序列化是执行 "deep clone" 的一种方法,但正如您所发现的,并非所有类型都可以序列化。

如果您只是修改一级值类型属性(不更改相关项的值或引用),您可以使用 object.MemberwiseClone 创建一个 副本(值类型和引用的副本)。