可空类型的转换在DataRowToEntity方法中的使用

    在项目中为了方便,写了一个简单的扩展方法:

1 public static T ToEntity<T>(this DataRow dr){};//将一行数据转换为对应的实体

    之前还运行良好,但是自从把数据库中一个字段改为可空类型后,就出现问题了。

    比如对于int?类型,也就是Nullable<int>类型的属性,如果数据为DBNull还好说,直接将null赋值给int?也是安全的,但是如果有值,比如string类型"12"的话,在强制类型转换的时候就出现如下错误:

从“System.String”到“System.Nullable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]”的强制转换无效。

    尝试了很多方法,也查了些资料,得到的临时办法就是去用if-else 或者switch-case表达式去适配可能会出现的类型:int?,float?,double?,decimal?等等,但是总感觉不是最优的解决方案。

   碰巧今天在网上查一个关于泛型的反射的时候,找到一个可以获取泛型参数的方法,于是正好可以用于修改上述方法:

1  //if(是泛型)并且(是Nullable类型的泛型)
2 if(proper.PropertyType.IsGenericType && proper.PropertyType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
3  {
4      //获取泛型参数集合。
5      //对于Dictionary<key,value>这类多参数的泛型的话,可以拿到泛型参数key和value类型组成的数组了!
6     Type  _tempType = proper.PropertyType.GetGenericArguments()[0];//这里对于Nullable类型来说,只有一个参数,而且可以安全拿到,也就是可以拿到Nullable<T>中T的类型了
7  }

  于是再将string类型的值强制转换为_tempType类型的话就是比较安全的转换了(类似于System.Convert.ToInt32("12")),再把这个值赋值给可空类型的属性,自然也是安全不错的。

  似乎完美解决了?

 

  怕久了不用又忘记了,记个笔记,以备后查。

posted @ 2014-01-20 21:43  CrisiDoff  阅读(657)  评论(0编辑  收藏  举报