静态列表中的项目<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
创建一个 浅 副本(值类型和引用的副本)。
所以我有一个静态项目列表,其中存储了一些 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
创建一个 浅 副本(值类型和引用的副本)。