将同一基类中的不同子类放入一个C#列表中

本文关键字:一个 列表 子类 基类 | 更新日期: 2023-09-27 18:00:58

我想添加从同一基类扩展到List中的不同子类。

这就是基类:

public class InteractionRequirement {
        protected int requirementNumber;
        public int RequirementNumber{
            get{ return requirementNumber;}
            set{ requirementNumber = value;}
        }
    }

这些是子类:

public class ObjectInteraction : InteractionRequirement {
    protected string objectName;
    --getter and setter here--
}
public class CharacterInteraction: InteractionRequirement {
    protected string characterName;
    --getter and setter here--
}
public class AssetInteraction: InteractionRequirement {
   protected string assetName;
   --getter and setter here--
}

我把它们添加到一个列表中:

List<InteractionRequirement> interactionRequirements = new List<InteractionRequirement>();
ObjectInteraction objectInteraction = new ObjectInteraction();
CharacterInteraction characterInteraction = new CharacterInteraction();
AssetInteraction assetInteraction = new AssetInteraction();
interactionRequirements.Add(objectInteraction);
interactionRequirements.Add(characterInteraction);
interactionRequirements.Add(assetInteraction);

但我似乎无法从子类中检索属性值,这是一个错误。

string oName = interactionRequirement[0].ObjectName;
string cName = interactionRequirement[1].CharacterName;
string aName = interactionRequirement[2].AssetName;

将同一基类中的不同子类放入一个C#列表中

这是因为interactionRequirements集合的类型是InteractionRequirement,而不是派生类型(ObjectInteraction、CharacterIteraction或AssetInteraction(。

因此,你需要打个石膏。

string oName = ((ObjectInteraction)interactionRequirement[0]).ObjectName;

您也可以使用as并检查强制转换是否成功。

var objectInteraction = interactionRequirement[0] as ObjectInteraction;
if (objectInteraction != null) 
{
   string oName = objectInteraction.ObjectName;
}

http://ideone.com/4giIL4

另外需要注意的是,您可能需要将ObjectName的保护级别更改为public,以便可以在适当的上下文中访问它(在类和派生类之外(。