Il tuo codice, così com'è ora, trasferirà qualsiasi valore a livello di stringa . Questo è un approccio davvero pessimo . Le conversioni implicite in atto dipendono fortemente dalle impostazioni del tuo sistema (lingua e cultura). La parte peggiore è:potrebbe funzionare perfettamente sulla tua macchina mentre la stai testando, ma sul sistema di un cliente si interrompe con strani messaggi. Buon debug :-(
Cambia il tuo codice in questo modo
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);
}
Ciò aggiungerà la colonna, anche se si tratta di un tipo nullable, con il tipo di dati corretto.
crediti: Questa risposta mi ha aiutato
AGGIORNAMENTO Ancora più semplice
(grazie a Yves M. in un commento sotto la risposta collegata)
foreach (PropertyInfo prop in props) {
// Setting column names as Property names.
dataTable.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
}