如何检查各种“是”;条件和相应的类型

本文关键字:条件 类型 何检查 检查 | 更新日期: 2023-09-27 18:18:04

我有三个班叫做学校,老师和学生。现在让我们假设我有一个名为GetAcademicDetailsOfCity()的方法,它将生成一个School, Teacher和Student中任何类型的对象,或者可能是由三者中的任何一个派生的类。

在运行时,我想检查下面:

var instance = GetAcademicDetailsOfCity();
if (instance is School)
{
     //What i actually want is something like  
      var result = new School();   
      result.property1 = (School)instance.property1  
      result.property2 = (School)instance.property2  
      result.property3 = (School)instance.property3  
}
if (instance is Teacher)
{
      var result = new Teacher();  
      result.property1 = (Teacher)instance.property1  
      result.property2 = (Teacher)instance.property2  
      result.property3 = (Teacher)instance.property3  
}
if (instance is Student)
{
      var result = new Student();
      result.property1 = (Student)instance.property1  
      result.property2 = (Student)instance.property2  
      result.property3 = (Student)instance.property3 
}

如何一次性检查以上条件

if (instance is School || instance is Teacher || instance is Student)
{
      //What should be the casting of instance below ??
      var result = (????)instance;
}
return result;

使用这个结果实例,我将创建一个特定学校城市的学生报告。如果需要更多的细节,请告诉我。我很乐意提供尽可能多的细节:)

如何检查各种“是”;条件和相应的类型

如果GetAcademicDetailsOfCity()返回一个公共基类型(即不仅仅是Object),让我们称之为MyBaseType,您可以使用else if这样来提高效率(因为它只执行一个if块,而不是像您在问题中那样执行所有三个块):

if (instance is School)
{
    var result = (School) instance;
    // Do stuff specific to an instance of School
}
else if (instance is Teacher)
{
    var result = (Teacher) instance;
    // Do stuff specific to an instance of Teacher
}
else if (instance is Student)
{
    var result = (Student) instance;
    // Do stuff specific to an instance of Student
}

理想情况下,您希望这3个类中的每一个都实现一个公共接口或从提供GetAcademicDetailsOf函数的基类继承。这样你只需要担心最小的类型转换。

AcademicDetails results = instance.GetAcademicDetails();