#c# #forms #oop #combobox #polymorphism
#c# #формы #ооп #Поле со списком #полиморфизм
Вопрос:
Итак, у меня есть родительский класс с именем SalesRep и дочерний класс с именем SeniorSalesRep. Я понял это так, что он полиморфно отображает оба класса в списке. Проблема, с которой я сталкиваюсь, заключается в том, что у меня есть поле со списком, которое дает пользователю возможность выбора отображения отчета об объектах в классе SalesRep, который также должен отображать объекты SeniorSalesRep, и если он выбран просто SeniorSalesRep, он показывает только объекты SeniorSales Rep. Однако, когда я реализую это, он создает дополнительный объект с именем object, который отображает только объекты SalesRepObjects, а не объекты SeniorSalesRep. Как я могу избавиться от этого дополнительного объекта в моем поле со списком?
public void LoadTypeComboBox()
{
List<string> salesRepTypes = new List<string>();
foreach (SalesRep thisSalesRep in allSalesReps)
{
string s = thisSalesRep.GetType().Name;
string baseType = thisSalesRep.GetType().BaseType.Name;
if (!salesRepTypes.Contains(s))
{
salesRepTypes.Add(s);
}
if (!salesRepTypes.Contains(baseType))
{
salesRepTypes.Add(baseType);
}
}
cboObjectType.DataSource = salesRepTypes;
}
private void cboObjectType_SelectedIndexChanged(object sender, EventArgs e)
{
lstSalesReps.DataSource = null;
lstSalesReps.Items.Clear();
foreach (var i in allSalesReps)
{
if (i.GetType().Name == cboObjectType.SelectedItem.ToString())
{
lstSalesReps.Items.Add(i);
}
else if (i.GetType().BaseType.Name == cboObjectType.SelectedItem.ToString())
{
lstSalesReps.Items.Add(i);
}
}
}
Ответ №1:
Код, который отображается object
в выпадающем списке, выглядит следующим образом:
string baseType = thisSalesRep.GetType().BaseType.Name;
Базовый тип SalesRep
is object
. Вы должны либо удалить object
его из своей коллекции, либо вообще никогда не добавлять.
GetType
указывает тип объекта во время выполнения. Так что я не думаю, что вам нужно .BaseType
. Попробуйте это:
public void LoadTypeComboBox()
{
List<string> salesRepTypes = new List<string>();
foreach (SalesRep thisSalesRep in allSalesReps)
{
string type = thisSalesRep.GetType().Name;
if (!salesRepTypes.Contains(s))
{
salesRepTypes.Add(s);
}
}
cboObjectType.DataSource = salesRepTypes;
}
Или даже лучше с Linq:
cboObjectType.DataSource = allSalesReps
.Select(r => r.GetType().Name)
.Distinct()
.ToList();
Комментарии:
1. @ToriPerkins Вы можете пометить его как принятый ответ, если это помогло вашей проблеме 🙂