Search code examples
c#formsoopcomboboxpolymorphism

C# Form is displaying an extra object


So I have a parent class called SalesRep and a child class called SeniorSalesRep. I have got it so it displays both classes polymorphically to a listbox. The issue I'm having is that I have a combo box that gives the user the choice of displaying a report of the objects in the SalesRep class which should also display the SeniorSalesRep objects and if it's selected just SeniorSalesRep it only shows SeniorSales Rep objects. However, when I'm implementing this it creates an extra object called object which displays only SalesRepObjects and not SeniorSalesRep objects. How can I get rid of that extra object in my combo box?

 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);
            }
        }
    }

Form Output


Solution

  • The code that shows object in combobox is this:

    string baseType = thisSalesRep.GetType().BaseType.Name;
    

    The base type of SalesRep is object. You should either remove object from your collection or never add in the first place.

    GetType gives you the runtime type of the object. So I don't think you need .BaseType. Try this:

     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;
        }
    

    Or even better with Linq:

    cboObjectType.DataSource = allSalesReps
                        .Select(r => r.GetType().Name)
                        .Distinct()
                        .ToList();