C# 具有混合属性的继承类列表

C# 具有混合属性的继承类列表,c#,list,linq,inheritance,C#,List,Linq,Inheritance,我正在制作一个RPG,并且我使用继承的类设置了项目系统,但是我很难找到一个商店列表的子集,它允许我使用所有类的属性来过滤它们 以下是我遇到的问题的精简版本: public class GameItem { public string strName; public int intQuantity; public int intItemType; } public class GeneralItem : GameIt

我正在制作一个RPG,并且我使用继承的类设置了项目系统,但是我很难找到一个商店列表的子集,它允许我使用所有类的属性来过滤它们

以下是我遇到的问题的精简版本:

    public class GameItem
    {
        public string strName;
        public int intQuantity;
        public int intItemType;
    }

    public class GeneralItem : GameItem
    {
        public int intTargetType;
    }

    public class EquipmentItem : GameItem
    {
        public int intAttackPower;
        public int intDefensePower;
        public int intEquipmentType;
        public bool blnEquippableByPlayer1;
    }

    private void GetShopItems()
    {
        Items.Add(new GeneralItem() { strName = "Healing Potion", intItemType = 2, intQuantity = 10, intTargetType = 0 });
        Items.Add(new EquipmentItem() { intItemType = 0, intEquipmentType = 0, blnEquippableByPlayer1 = true, strName = "Sword", intQuantity = 1, intAttackPower = 10, intDefensePower = 2 });
        Items.Add(new EquipmentItem() { intItemType = 0, intEquipmentType = 1, blnEquippableByPlayer1 = false, strName = "Armor", intQuantity = 1, intAttackPower = 10, intDefensePower = 2 });

        //cannot convert GeneralItem to GameItemEquipment
        List<GameItem> ShopItems = Items.Where(x => x.intQuantity > 0 && ((EquipmentItem)x).blnEquippableByPlayer1).ToList(); 
    }
公共类游戏项
{
公共字符串strName;
公共数量;
公共int初始化类型;
}
公共类通用项:GameItem
{
公共int INTTARGETYPE;
}
公共类装备物品:游戏物品
{
公共int接入电源;
公共权力;
公共int智能设备类型;
公共图书馆blnEquippableByPlayer1;
}
私有void GetShopItems()
{
添加(新的GeneralItem(){strName=“治疗药剂”,intItemType=2,intQuantity=10,intTargetType=0});
添加(新设备项(){intItemType=0,intEquipmentType=0,blnEquippableByPlayer1=true,strName=“Swarm”,intQuantity=1,intAttackPower=10,intDefensePower=2});
添加(新设备项(){intItemType=0,intEquipmentType=1,blnEquippableByPlayer1=false,strName=“Armor”,intQuantity=1,intAttackPower=10,intDefensePower=2});
//无法将GeneralItem转换为GameItemEquipment
列出ShopItems=Items.Where(x=>x.intQuantity>0&((设备项)x).blnEquippableByPlayer1.ToList();
}

我之所以需要这样做,是因为我想在商店中显示所有商品,而不考虑其类型。由于不是所有物品都是装备,当它到达治疗药剂时会失败。

你必须首先检查物品是否是装备:

.Where(x => x.intQuantity > 0 && (x is not EquipmentItem || (x as EquipmentItem).blnEquippableByPlayer1))
话虽如此,我认为该商品本身可以控制是否可用于购物:

GameItem
中:

public virtual bool IsAvailableInShop() => intQuantity > 0;
public override bool IsAvailableInShop() 
    => base.IsAvailableInShop() && blnEquippableByPlayer1;
设备项中

public virtual bool IsAvailableInShop() => intQuantity > 0;
public override bool IsAvailableInShop() 
    => base.IsAvailableInShop() && blnEquippableByPlayer1;
然后

var ShopItems = Items.Where(x => x.IsAvailableInShop());

您必须首先检查项目是否为设备:

.Where(x => x.intQuantity > 0 && (x is not EquipmentItem || (x as EquipmentItem).blnEquippableByPlayer1))
话虽如此,我认为该商品本身可以控制是否可用于购物:

GameItem
中:

public virtual bool IsAvailableInShop() => intQuantity > 0;
public override bool IsAvailableInShop() 
    => base.IsAvailableInShop() && blnEquippableByPlayer1;
设备项中

public virtual bool IsAvailableInShop() => intQuantity > 0;
public override bool IsAvailableInShop() 
    => base.IsAvailableInShop() && blnEquippableByPlayer1;
然后

var ShopItems = Items.Where(x => x.IsAvailableInShop());

我实施了你的两个建议,效果非常好,非常感谢。我实施了你的两个建议,效果非常好,非常感谢。