基本上,我需要一个将DataReader
对象转换为泛型类型的转换器。
所以当我这样做时 -
while(dataReader.HasRows()){
var result= dataReader.ConvertToObject<MyModel>();
}
它调用泛型类型的扩展方法 -
public static T ConvertToObject<T>(this DbDataReader reader) where T : new()
{
T res = new T();
T t = new T();
for (int inc = 0; inc < reader.FieldCount; inc++)
{
Type type = t.GetType();
PropertyInfo prop = type.GetProperty(reader.GetName(inc));
var value = reader.GetValue(inc);
if (value == System.DBNull.Value)
{
value = null;
}
var targetType = IsNullableType(prop.PropertyType) ? Nullable.GetUnderlyingType(prop.PropertyType) : prop.PropertyType;
value = Convert.ChangeType(value, targetType);
prop.SetValue(t, value, null);
}
res = t;
return res;
}
private static bool IsNullableType(Type type)
{
return type.IsConstructedGenericType && type.GetGenericTypeDefinition().Equals(typeof(Nullable<>));
}
除datareader
System.DBNull
的结果为System.String
之前一切正常
要处理空值,我强行检查该值是否为System.DBNull
的类型,然后为其指定一个C#NULL
对象。
if (value == System.DBNull.Value)
{
value = null;
}
但是,对于数字类型对象,结果为null时,无法进行转换。
所以基本上我要做的是当结果值是类型 - System.Nullable[System.Decimal]
然后
if (value == System.DBNull.Value)
{
value = (System.Decimal?) null;
}
或
value = (System.DateTime?)null //for DateTime
value = (System.Int32?)null //for Int32
我试图获取动态属性类型
if (value == System.DBNull.Value)
{
value = (prop.PropertyType ?) null; // to get it dynamic
}
这没有用。请让我知道我要做什么?
答案 0 :(得分:4)
您无法将null
指定为T
类型的值,因为它可能不是T
的有效值。 (想想int
等。)
但是,您可以使用default(T)
,这将是T
的默认值 - 如果您将T
类型的字段保留为未初始化,则会获得相同的值,例如。那将是: