[英]Items in static List<Item>()
因此,我有一個靜態項目列表,其中存儲了幾個類,這些類中有諸如“ 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;
然后在其他類中,我有AddItem(int ID)
方法:
void AddItem(int id)
{
foreach (Item i in ItemDatabase.Items)
if (i.ID == id)
playerItems.Add(i);
}
我目前正在添加將使用相同數據的實體。 但是,當我修改添加到playerItems的Item時,它修改了ItemDatabase.Items(顯然是由於引用)。
我不能使Item類成為一個結構,因為我還有其他派生自其的類。 我需要將“ currentAmount”整數作為值。 有什么辦法可以做到嗎?
PS,我已經嘗試了深度克隆,但在我的Item類中效果不佳。
您需要將currentAmount
分開。 由於無論如何該值僅在Player
上下文中才有意義,因此我將其從Item
類中取出,並使用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
}
顯然,如果要更改對象而不影響原始對象,則需要克隆對象。 序列化是進行“深度克隆”的一種方法,但是您發現並非所有類型都可以序列化。
如果僅修改第一級值類型屬性(不更改相關項目的值或引用),則可以使用object.MemberwiseClone
來創建淺表副本(值類型和引用的副本)。
我仍然不確定在哪里修改ItemsDatabase.Items(currentAmount作為Entity屬性沒有多大意義),但是對於庫存中的當前金額,我想這將對您有所幫助:
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.
}
}
重要:
字典使用哈希從字典中獲取對象,因此,您可能想在Item類中重寫該方法:
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... })
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.