Ihr Code - so wie er jetzt ist - wird jeden Wert auf String-Ebene übertragen . Das ist ein wirklich schlechter Ansatz . Die stattfindenden impliziten Konvertierungen hängen stark von den Einstellungen Ihres Systems (Sprache und Kultur) ab. Das Schlimmste ist:Während Sie es testen, funktioniert dies auf Ihrem Computer möglicherweise hervorragend, aber auf dem System eines Kunden bricht es mit seltsamen Meldungen ab. Viel Spaß beim Debuggen :-(
Ändern Sie Ihren Code wie folgt
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);
}
Dadurch wird die Spalte mit dem richtigen Datentyp hinzugefügt, auch wenn es sich um einen Nullable-Typ handelt.
Credits: Diese Antwort hat mir geholfen
UPDATE Noch einfacher
(danke an Yves M. in einem Kommentar unter der verlinkten Antwort)
foreach (PropertyInfo prop in props) {
// Setting column names as Property names.
dataTable.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
}