Su código, tal como está ahora, transferirá cualquier valor a nivel de cadena . Este es un enfoque realmente malo . Las conversiones implícitas que tienen lugar dependen en gran medida de la configuración de su sistema (idioma y cultura). La peor parte es:esto podría funcionar muy bien en su máquina mientras la está probando, pero en el sistema de un cliente se rompe con mensajes extraños. Feliz depuración :-(
Cambia tu código así
foreach (PropertyInfo prop in props) {
// Setting column names as Property names.
if (prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
dataTable.Columns.Add(prop.Name, prop.PropertyType.GetGenericArguments()[0]);
else
dataTable.Columns.Add(prop.Name, prop.PropertyType);
}
Esto agregará la columna, incluso si se trata de un tipo anulable, con el tipo de datos correcto.
créditos: Esta respuesta me ayudó
ACTUALIZAR Aún más simple
(gracias a Yves M. en un comentario debajo de la respuesta vinculada)
foreach (PropertyInfo prop in props) {
// Setting column names as Property names.
dataTable.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
}