Форма C # отображает дополнительный объект

#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 Вы можете пометить его как принятый ответ, если это помогло вашей проблеме 🙂