Mã của bạn - như hiện tại - sẽ chuyển bất kỳ giá trị nào ở cấp chuỗi . Đây là một cách tiếp cận thực sự tồi tệ . Các chuyển đổi ngầm diễn ra phụ thuộc nhiều vào cài đặt hệ thống của bạn (ngôn ngữ và văn hóa). Phần tồi tệ nhất là:Điều này có thể hoạt động tốt trên máy của bạn khi bạn đang kiểm tra nó, nhưng trên hệ thống của khách hàng, nó bị hỏng với các thông báo lạ. Gỡ lỗi vui vẻ :-(
Thay đổi mã của bạn như thế này
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);
}
Thao tác này sẽ thêm cột - ngay cả khi đây là kiểu nullable - với kiểu dữ liệu chính xác.
tín dụng: Câu trả lời này đã giúp tôi
CẬP NHẬT Thậm chí còn đơn giản hơn
(Thx cho Yves M. trong một bình luận bên dưới câu trả lời được liên kết)
foreach (PropertyInfo prop in props) {
// Setting column names as Property names.
dataTable.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
}