Объявить производный класс в if/else без повторения полей базового класса

В настоящее время я пытаюсь заполнить словарь из данных, которые я получаю из строки 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.

Есть ли способ сделать это без определения полей базового класса для каждого типа элемента?

Ответ 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);
}

Ответ 2

Чтобы построить ответ на davisoa, но все равно не требует отбрасывания: помните, вы можете иметь более одной ссылки на объект. Yay, полиморфизм!

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);
}