我使用下面的代码:
public static List<T> ConvertToList1<T>(DataTable dt)
{
var columnNames = dt.Columns.Cast<DataColumn>()
.Select(c => c.ColumnName)
.ToList();
var properties = typeof(T).GetProperties();
return dt.AsEnumerable().Select(row =>
{
T objT1 = Activator.CreateInstance<T>();
foreach (var pro in properties)
{
if (columnNames.Contains(pro.Name))
{
PropertyInfo? pI = objT.GetType().GetProperty(pro.Name);
pro.SetValue(objT, row[pro.Name] == DBNull.Value ? null : Convert.ChangeType(row[pro.Name], pI.PropertyType));
}
}
return objT1;
}).ToList();
}
但我得到的十进制字段具有空值的错误。
从'System.Decimal'到'System.Nullable'的转换无效1[[System.Decimal,System.Private.CoreLib,版本=6.0.0.0,区域性=中性
public class SampleModel
{
public Guid Id { get; set; }
public Guid ProjectId { get; set; }
public string? Code { get; set; } = null!;
public string? Description { get; set; }
public decimal? Quantity1 { get; set; }
public decimal? Quantity2 { get; set; }
}
有人能建议如何解决这个问题吗?
3条答案
按热度按时间zfciruhq1#
嗯,阅读一遍......你的意思是说行中的非空小数不能赋给可空小数?还是说dbnull不能赋给可空小数?
您可以使用
DataRow.IsNull
来检查值是否为dbnull。在这种情况下,您只需跳过它,因为可为null的值已经具有默认null。uajslkp62#
我有一个剧本。来自@瑞安威尔逊的链接非常有用。
简而言之,如果您有一个可以为null的类型,您希望强制转换为基础类型。请考虑:
这是非常合理的代码,我们可以给
decimal?
变量赋值。使用
Nullable.GetUnderlyingType(myType)
返回一个类型,如果myType
不可为空,则返回null。这里,
underlying2
是null
,并且underlying1
是decimal
。为了将其付诸实践,我们将转换方法的最内层部分稍微修改为:
jk9hmnmh3#
请尝试以下操作: