c#参数中丢弃对象类型

本文关键字:对象 类型 参数 | 更新日期: 2023-09-27 18:07:40

这是我遇到问题的代码部分;

List<People> people = new List<People>();

,这是由3种不同类型的对象填充,都派生自People类;

people.Add(new Student(constructorarguments);
people.Add(new AcademicStaff(constructorarguments);
people.Add(new AdministrativeStaff(constructorarguments);

这就是给我带来问题的代码;

private void studentCheckbox_CheckedChanged(object sender, EventArgs e)
{
    if (studentCheckbox.CheckState == CheckState.Checked)
    {
        foreach (Student student in people)
        {
            if (student.Compare(SearchTextBox.Text) == 0)
            {
                resultsListBox.Items.Add(student.Forename);
            }
        }
    }
    else
    {}
}

它使用了一个windows窗体,正如您从CheckState代码中看到的那样。但我遇到的问题是,它并没有将比较限制在学生身上。它试图超越学生,并试图将学术人员视为学生,这就是我的程序出错的地方。我在过去的几个小时里一直在努力解决这个问题,没有任何余地,任何帮助都会非常感激!

我不认为问题出在表单或类本身,但我不知道为什么当我把它限制在学生类型

c#参数中丢弃对象类型

时,它试图转移到AcademicStaff上

这是预期的行为,编译器枚举您的集合并隐式地将每个项强制转换为Student类型。
如果您只想循环Students,则应该首先使用OfType<>():

过滤people集合
foreach(var student in people.OfType<Student>())
{
  ..
}

您不能在有人员的列表上使用"Student"类型进行迭代,此代码不应该编译。你需要这样迭代:

foreach (People person in people)

,如果你想把当前的人转换为学生,你应该写:

Student s = person as Student;

,然后你就可以访问学生方法

您可以使用linq-method OfType():

private void studentCheckbox_CheckedChanged(object sender, EventArgs e)
{
    if (studentCheckbox.CheckState == CheckState.Checked)
    {
        foreach (Student student in people.OfType<Student>())
        {
            if (student.Compare(SearchTextBox.Text) == 0)
            {
                resultsListBox.Items.Add(student.Forename);
            }
        }
    }
    else
    {}
}