Using Reflection to Determine whether an Type is Nullable And Get the underlying Type
/// <summary> /// Converts a Generic List into a DataTable /// </summary> /// <param name="list"></param> /// <param name="typ"></param> /// <returns></returns> private DataTable GetDataTable(IList list, Type typ) { DataTable dt = new DataTable(); // Get a list of all the properties on the object PropertyInfo[] pi = typ.GetProperties(); // Loop through each property, and add it as a column to the datatable foreach (PropertyInfo p in pi) { // The the type of the property Type columnType = p.PropertyType; // We need to check whether the property is NULLABLE if (p.PropertyType.IsGenericType && p.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>)) { // If it is NULLABLE, then get the underlying type. eg if "Nullable<int>" then this will return just "int" columnType = p.PropertyType.GetGenericArguments()[0]; } // Add the column definition to the datatable. dt.Columns.Add(new DataColumn(p.Name, columnType)); } // For each object in the list, loop through and add the data to the datatable. foreach (object obj in list) { object[] row = new object[pi.Length]; int i = 0; foreach (PropertyInfo p in pi) { row[i++] = p.GetValue(obj, null); } dt.Rows.Add(row); } return dt; }