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代码中看到的那样。但我遇到的问题是,它并没有将比较限制在学生身上。它试图超越学生,并试图将学术人员视为学生,这就是我的程序出错的地方。我在过去的几个小时里一直在努力解决这个问题,没有任何余地,任何帮助都会非常感激!
我不认为问题出在表单或类本身,但我不知道为什么当我把它限制在学生类型
这是预期的行为,编译器枚举您的集合并隐式地将每个项强制转换为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
{}
}