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

Posted luluping

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
        }
    }

以上是关于Convert.ChangeType不能处理Nullable类型的解决办法(转)的主要内容,如果未能解决你的问题,请参考以下文章

Convert.ChangeType() 在可空类型上失败

C#怎么用Convert.ChangeType转换一个函数模板类型?

C#中强化ChangeType方法使其支持枚举类型转换

C#中强化ChangeType方法使其支持枚举类型转换

泛型方法

考虑到货币符号的数字的通用转换