我有三种类型:
Patient
Inpatient : Patient
Outpatient : Patient
我有一种方法可以填充基础患者及其所有属性:PatientRepository.FillPatient()
并返回Patient
个对象。
然后,我需要查看并查看Patient
类型的内容并向下转换为Outpatient
或Inpatient
。
当我尝试向下转换时,它正在抛出Unable to cast object of type 'Patient' to type 'Inpatient'.
这是一个运行时错误。
if (patient.Type == PatientType.Inpatient)
{
var inpatient = (Inpatient)patient;
return inpatient;
}
public enum PatientType
{
Inpatient, Outpatient
}
我不知道为什么。我从根本上做错了吗?
答案 0 :(得分:3)
您的 FillPatient 应该以正确的方式返回特定的类:
public static Patient FillPatient()
{
if (something) {
return new InPatient();
}
else {
return new OutPatient();
}
}
然后你可以将它转发给特定的班级
Patient patient = PaitentRepository.FillPatient();
if (patient is InPatient) {
...
}
else {
...
}
注意:大多数情况下,当一个类是N个其他类的基础时,该基类(在您的情况下为 Patient )将是抽象的。
答案 1 :(得分:1)
因为问题说“投掷”我会认为这是一个运行时错误。这反过来意味着PatientRepository.FillPatient()
返回Patient
类型的对象,某处包含new Patient()
。您可以将基类Patient
标记为abstract
,然后应该得到一些编译器错误。
如果要在某个时刻转换为子类型PatientRepository.FillPatient()
必须创建此子类型的实例。因此,您需要使用new Patient()
和new Inpatient()
而不是new Outpatient()
,而不是{{1}},具体取决于您尝试填充的患者类型。