代码之家  ›  专栏  ›  技术社区  ›  Manoz

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

  •  2
  • Manoz  · 技术社区  · 8 年前

    基本上,我需要一个转换器来转换 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

    系统否为空 然后将其指定为C# NULL 对象

    if (value == System.DBNull.Value)
    {
        value = null;
    }
    

    基本上我要做的是当结果值是type时- 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 回复  |  直到 8 年前
        1
  •  9
  •   Jon Skeet    8 年前

    您不能指定 null 作为类型的值 T 因为它可能不是的有效值 T . (思考 int

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

    • 对于引用类型,为null文字
    • 对于可为null的值类型,类型的null值