将对象转换为正确的类型

本文关键字:类型 对象 转换 | 更新日期: 2023-09-27 18:33:27

我没有什么问题。在我的代码的第一种方法中,我已经将有关学生的数据从 txt 文件加载到列表集合。还有更多类型的学生(班级小学生,中学生,高中生,大学生,校外学生等...现在,在其他方法中,我想将每种学生保存到不同的目录。我的问题是我把所有对象都放在该接口的一个集合中。现在我如何区分或我应该怎么做才能区分所有类型的学生?请帮忙。

将对象转换为正确的类型

如果你的列表是通用的,即 List<Student>您可以执行以下操作:

List<PrimaryStudent> primaryStudents = myStudentList.OfType<PrimaryStudent>().ToList();

如果你的列表不是通用的,你可以像这样将它们分开:

foreach(var s in myStudentList)
{
  if(s is PrimaryStudent)
  { 
    // add to PrimaryStudents list
  }
  else if(s is SecondaryStudent)
  {
    ...
  }
}

看看 c# 中的 is 关键字。

例:

List<IStudent> students = new List<IStudent>();
students.Add(new PrimaryStudent());
students.Add(new SecondaryStudent());
students.Add(new HightSchoolStudent());
foreach (IStudent student in students)
{
    if (student is PrimaryStudent)
    {
        Console.WriteLine("This was a PrimaryStudent");
    }
    else if (student is SecondaryStudent)
    {
        Console.WriteLine("This was a SecondaryStudent");
    }
    else if (student is HightSchoolStudent)
    {
        Console.WriteLine("This was a HightSchoolStudent");
    }
}
Console.Read();

输出:

This was a PrimaryStudent
This was a SecondaryStudent
This was a HightSchoolStudent

您可以先从集合中获取所有学生类型,然后按类型将它们保存到最终位置。此处介绍的解决方案不使用 is 或 OfType<> LINQ 方法,因为如果要将学生、主要学生和中学学生存储在不同的文件夹中,这些运算符将无法正常工作。

换句话说,如果你想以不同的方式对待基类的实例(例如保存到不同的文件夹),你需要放弃 OfType 和 is 运算符,但直接检查类型。

class Student { }
class PrimaryStudent : Student { }
class SecondaryStudent : Student { }
private void Run()
{
    var students = new List<Student> { new PrimaryStudent(), new PrimaryStudent(), new SecondaryStudent(), new Student() };
    Save(@"C:'University", students);
}
private void Save(string basePath, List<Student> students)
{
    foreach (var groupByType in students.ToLookup(s=>s.GetType()))
    {
        var studentsOfType = groupByType.Key;
        string path = Path.Combine(basePath, studentsOfType.Name);
        Console.WriteLine("Saving {0} students of type {1} to {2}", groupByType.Count(), studentsOfType.Name, path);
    }
}
Saving 2 students of type PrimaryStudent to C:'University'PrimaryStudent
Saving 1 students of type SecondaryStudent to C:'University'SecondaryStudent
Saving 1 students of type Student to C:'University'Student