2

我有三种类型:

  1. Patient
  2. Inpatient : Patient
  3. Outpatient : Patient

我有一个填充基础患者及其所有属性的方法:PatientRepository.FillPatient()并返回一个Patient对象。

然后我需要检查并查看Patient类型是什么,然后向下转换为 anOutpatientInpatient.

当我尝试向下转换时,它会抛出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
}

我不知道为什么。我从根本上在这里做错了什么吗?

4

2 回答 2

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)将是抽象的。

于 2013-01-23T18:35:56.877 回答
1

因为问题说“抛出”,所以我认为这是一个运行时错误。这反过来意味着PatientRepository.FillPatient()返回一个类型的对象,Patient并且在某处包含new Patient(). 您可以将基类标记Patientabstract,然后应该得到一些编译器错误。

如果您想在某个时候强制转换为子类型,PatientRepository.FillPatient()则必须创建此子类型的实例。因此,new Patient()您不必使用new Inpatient()new Outpatient()取决于您尝试填充的患者类型。

于 2013-01-23T18:37:11.873 回答