Convert.ChangeType不能处理Nullable类型的解决办法(转)

https://www.cnblogs.com/patrickyu/p/3211115.html

在做一个ORMapping功能的时候发现,Convert.ChangeType不能处理nullable类型,比如int?.

解决办法也很简单,贴出完整的代码(大部分代码来自网络),注意下面代码没经过完整测试,不要直接用在项目里:

public delegate void SetValue<T>(T value);

public static class ORMapping<T> where T : class, new()
    {
        private static Delegate CreateSetDelegate(T model, string propertyName)
        {
            MethodInfo mi = model.GetType().GetProperty(propertyName).GetSetMethod();
            //这里构造泛型委托类型
            Type delType = typeof(SetValue<>).MakeGenericType(GetPropertyType(propertyName));
            return Delegate.CreateDelegate(delType, model, mi);
        }
        private static Type GetPropertyType(string propertyName)
        {
            return typeof(T).GetProperty(propertyName).PropertyType;
        }
        
        public static IList<T> ConvertToBusinessEntityList(DataTable dt)
        {
            IList<T> list = new List<T>();
            if (dt == null || dt.Rows.Count < 1) return list;
            Delegate setDelegate;
            foreach (DataRow dr in dt.Rows)
            {
                T model = new T();
                foreach (DataColumn dc in dt.Columns)
                {
                    setDelegate = CreateSetDelegate(model, dc.ColumnName);
                    Type type = GetPropertyType(dc.ColumnName);
                    Type underlyingType = Nullable.GetUnderlyingType(type);
                    if (DBNull.Value != dr[dc.ColumnName])
                    {
                        setDelegate.DynamicInvoke(Convert.ChangeType(dr[dc.ColumnName], underlyingType ?? type));
                    }
                }
                list.Add(model);
            }
            return list;
        }
    }

原文地址:https://www.cnblogs.com/luluping/p/10182974.html

时间: 2024-08-27 14:38:07

Convert.ChangeType不能处理Nullable类型的解决办法(转)的相关文章

svn: Can&#39;t convert string from &#39;UTF-8&#39; to native encoding: 解决办法

在linux中,svn co 或 svn up 时有中文文件名的文件的话,可能会报下面的错: [[email protected]-dev-srv1 ~]# svn upsvn: Can't convert string from 'UTF-8' to native encoding:svn: src/main/webapp/resources/js/My97DatePicker/?\229?\188?\128?\229?\143?\145?\229?\140?\133 先locale看一下系统

Mybatis:使用bean传值,当传入值为Null时,提示“无效的列类型”的解决办法

问题描述: 在使用mybatis对数据库执行更新操作时,parameterType为某个具体的bean,而bean中传入的参数为null时,抛出异常如下: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='pxh',

WCF项目中出现“目标程序集不包含服务类型”的解决办法

如果创建新项目时(以下简称A项目)选择的是WCF相关的项目模板,并且在A项目中只定义接口而不实现接口,那么任何引用了A项目的项目,在调试时都会弹出警告框“目标程序集不包含服务类型.可能需要调整此程序集的代码访问安全策略.”.解决办法是,用记事本打开A项目的项目文件,删除如下节点: <ProjectTypeGuids>{3D9AD99F-2412-4246-B90B-4EAA41C64699};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectT

从简单类型到复杂类型的参数传递用例,以及传递简单string类型的解决办法

一,简单类型的传值 比如 public Users Get(int id) ,它可以使用两种方式获取: api/default/5 $.get("/api/default",{id:90}, function (data) {/* 处理逻辑 */}); 前者不需要注明参数名,后者适用于存在多个简单参数的情况,例如比较实际的案例以及对应的获取方式是: public Users Get(int id, int id2) $.get("/api/default",{id:

Spring @ResponseBody只能返回String类型数据解决办法

今天自己搭Spring MVC框架玩,使用AJAX调用Spring controller 并返回map对象,突然发现,哎,怎么@Response中只能返回String, 我用的Spring 3的版本也不低啊,百思不得其解,遂去官方论坛查找原因,好家伙,好多人都有这个经历,而且貌似有些官方人员也说不清怎么解决,人家提问题的都嚷嚷着要去提交bug了(看来官方支持人员也有渣渣啊).于是去spring-vramework官网查看文档,有如下描述Jackson  is supported directly

MySQL数据库传输BLOB类型数据丢失 解决办法

修改MySQL安装目录下my.ini文件配置: 添加 max_allowed_packet = 16M # MySQL Server Instance Configuration File # ---------------------------------------------------------------------- # Generated by the MySQL Server Instance Configuration Wizard # # # Installation I

项目中遇到的某些问题及解决办法(一)

简介 该博文记录了一些平时在工作中遇到的问题及解决办法,某些问题有解决办法,某些问题暂时没有解决办法,如果有大神知道的,请多多指点. 如果某些问题有更好的解决办法,也请指教. 正文 1.在一个方法中用泛型操作两个不同的类型(Type). 难点:需要实现一个方法,进入参数一个泛型,返回信息一个泛型.但是一个方法中泛型只支持一种类型. 解决办法:将进入和返回放在一个类型中,用特性将进入参数和返回参数区分开. 2.微信三方登录,需要在PC桌面应用端+API服务实现. 难点:微信官网只提供了网页三方登录

c#解决Nullable类型的转换 (包含DataContract的序列化和反序列化以及 该例子应用在反射属性setvalue的时候有用)

using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Reflection;using System.Runtime.Serialization;using System.Text;using System.Threading.Tasks;using System.Xml.Linq; namespace ConsoleApplication11{ [DataCont

Cannot convert value &#39;0000-00-00 00:00:00&#39; from column 1 to TIMESTAMP解决办法

在Mysql数据库中使用DATETIME类型来存储时间,使用JDBC中读取这个字段的时候,应该使用 ResultSet.getTimestamp(),这样会得到一个java.sql.Timestamp类型的数据.在这里既不能使用 ResultSet.getDate(),也不能使用ResultSet.getTime(),因为前者不包括time数据,后者不包括date数据. 但是在使用ResultSet.getTimestamp()时也不是完全安全的,例如,当数据库中的TIMESTAMP类型的字段值