Cannot implicitly convert type 'System.Collections.IList' to 'System.Collections.Generic.List

Steve7423
Steve7423 used Ask the Experts™
on
This is my first attempt at generics and I'm a little puzzled.  I don't understand what is causing this error.  I've googled this and so far no light bulb going off.  I've pointed out the line that causes the error but I can't seem to figure out why.  I've included the functions related so you can get the overall picture to see what I'm doing.  some insight would be appreciated.  also being the first attempt at generics, I'm not sure if I'm doing this right, so feed back is welcomed.


The error

Cannot implicitly convert type 'System.Collections.IList' to 'System.Collections.Generic.List<Domains.Entities.Employee>'


Error point
this is the Load event of a form called debug

private void Debug_Load(object sender, EventArgs e)
        {
            SQL_DataObject empData = new SQL_DataObject();
            
            Employee objemp = new Employee();

              [b]the Error line:[/b]    List<Employee> Lst_rcds = empData.Get_Data<Employee>(objemp);
        }

Open in new window




My DataObject Class:

 
public System.Collections.IList Get_Data<T>(object objentity)
        {
        
            string cs = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;

            using (SqlConnection con = new SqlConnection(cs))
            {
                SqlCommand cmd = new SqlCommand("SPGetStudentByID", con);
                cmd.CommandType = CommandType.StoredProcedure;
                //SqlParameter param = new SqlParameter("@ID", ID);
                //cmd.Parameters.Add(param);

                List<T> lst_entity = new List<T>();

                con.Open();
                SqlDataReader rdr = cmd.ExecuteReader();

                while (rdr.Read())
                {
                    //lst_entity.Add(Set_EntityFields(objentity));

                }
                
                return  lst_entity.ToList();
            }
              throw new NotImplementedException();
        }


private object Set_EntityFields<T>(T objentity)
        {
            setInstanceProperty<object>(objentity, "ID", 123);
            
            return null;
            
        }



static void setInstanceProperty<T>(object instance, string propertyName, T value)
        {
            Type type = instance.GetType();
            PropertyInfo propertyInfo = type.GetProperty(propertyName, BindingFlags.Instance | BindingFlags.Public, null, typeof(T), new Type[0], null);

            propertyInfo.SetValue(instance, value, null);

            return;
        }

Open in new window

Comment
Watch Question

Do more with

Expert Office
EXPERT OFFICE® is a registered trademark of EXPERTS EXCHANGE®
Freelance programmer / Consultant
Commented:
Instead of
public System.Collections.IList Get_Data<T>(object objentity)
try
public System.Collections.List Get_Data<T>(object objentity)

Note the second returns a List not an IList (= Interface)
Miguel OzSenior Software Engineer
Top Expert 2009

Commented:
The method needs to return strong type generic list. (Thus Ilist or List will not return the desired List<Employee>)
Replace:
public System.Collections.IList Get_Data<T>(object objentity)
with
public List<T> Get_Data<T>(T objentity)

Open in new window

Author

Commented:
AndyAinscow, Miguel Oz,


Thank you this solved it.  I can't believe I over looked this, ...forest through the trees I guess.

Miguel Oz, I will be granting the answer to AndyAinscow, since his response was correct and the first.  I made the change, removing System.Collections.IList and setting it to List<T>.  then, resolved another unrelated error and it worked.

Thank you both for directing my focal point to this difference.

Author

Commented:
Quick and accurate response.  Thank you

Do more with

Expert Office
Submit tech questions to Ask the Experts™ at any time to receive solutions, advice, and new ideas from leading industry professionals.

Start 7-Day Free Trial