zoukankan      html  css  js  c++  java
  • 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;
            }
        }

  • 相关阅读:
    【POJ2176】Folding
    【NOIP2018】赛道修建
    优雅的文本编辑器——Sublime Text 3的搭建与使用
    【NOIP2010】乌龟棋
    【POJ3585】Accumulation Degree
    【POJ3322】Bloxorz I
    python之路_常用模块介绍
    python之路_正则表达式及re模块
    python之路_内置函数及匿名函数
    python之路_递归函数及实例讲解
  • 原文地址:https://www.cnblogs.com/luluping/p/10182974.html
Copyright © 2011-2022 走看看