Din kod - som den är nu - kommer att överföra alla värden på strängnivå . Det här är ett riktigt dåligt tillvägagångssätt . De implicita konverteringarna som äger rum beror i hög grad på ditt systems inställningar (språk och kultur). Det värsta är:Detta kan fungera bra på din maskin medan du testar det, men på en kunds system bryter det med konstiga meddelanden. Glad felsökning :-(
Ändra din kod så här
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);
}
Detta kommer att lägga till kolumnen - även om detta är en nollbar typ - med rätt datatyp.
krediter: Det här svaret hjälpte mig
UPPDATERA Ännu enklare
(thx till Yves M. i en kommentar under det länkade svaret)
foreach (PropertyInfo prop in props) {
// Setting column names as Property names.
dataTable.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
}