我目前正在尝试从json字符串中收到的数据填充字典。
我目前的做法:
public class Item {
public class BaseItem {
public int id;
public int level;
}
public class Armor : BaseItem {
public int durability;
}
public class Weapon : BaseItem {
public int damage;
}
}
foreach (JsonObject jsonObject in jsonArray) {
if (jsonObject["armor"] != null) {
var item = new Item.Armor();
item.durability = jsonObject["armor"]["durability"];
} else if (jsonObject["weapon"] != null) {
var item = new Item.Weapon();
item.damage = jsonObject["weapon"]["damage"];
} else {
var item = new Item.BaseItem();
}
item.itemID = jsonObject["id"];
item.level = jsonObject["level"];
Item.data.Add(item.itemID, item);
}
不幸的是,这不会编译,因为我在if / else语句中声明了'item'。
如果没有为每个项目类型定义基类字段,有没有办法做到这一点?
答案 0 :(得分:1)
我会在item
声明之外声明if
。
foreach (JsonObject jsonObject in jsonArray) {
Item.BaseItem item;
if (jsonObject["armor"] != null) {
item = new Item.Armor();
((Item.Armor)item).durability = jsonObject["armor"]["durability"];
} else if (jsonObject["weapon"] != null) {
item = new Item.Weapon();
((Item.Weapon)item).damage = jsonObject["weapon"]["damage"];
} else {
item = new Item.BaseItem();
}
item.itemID = jsonObject["id"];
item.level = jsonObject["level"];
Item.data.Add(item.itemID, item);
}
答案 1 :(得分:1)
建立在davisoa的答案上,但仍然不需要强制转换:记住,你可以有一个以上的对象引用。是的,多态性!
foreach (JsonObject jsonObject in jsonArray)
{
Item.BaseItem item;
if (jsonObject["armor"] != null)
{
Item.Armor armor = new Item.Armor();
armor.durability = jsonObject["armor"]["durability"];
item = armor;
}
else if (jsonObject["weapon"] != null)
{
Item.Weapon weapon = new Item.Weapon();
weapon.damage = jsonObject["weapon"]["damage"];
item = weapon;
}
else
{
item = new Item.BaseItem();
}
item.itemID = jsonObject["id"];
item.level = jsonObject["level"];
Item.data.Add(item.itemID, item);
}