如何将空值分配给动态属性类型

时间:2017-09-08 05:43:05

标签: c# ado.net

基本上,我需要一个将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
}

这没有用。请让我知道我要做什么?

1 个答案:

答案 0 :(得分:4)

您无法将null指定为T类型的值,因为它可能不是T的有效值。 (想想int等。)

但是,您可以使用default(T),这将是T的默认值 - 如果您将T类型的字段保留为未初始化,则会获得相同的值,例如。那将是:

  • 对于引用类型,为空文字
  • 对于可空值类型,类型为
  • 的空值
  • 对于非可空值类型,&#34;全为零&#34;值(所有数值等都为0)