zoukankan      html  css  js  c++  java
  • Convert.ChangeType不能处理Nullable类型的解决办法

    在做一个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;
            }
        }

  • 相关阅读:
    [fw]PAGE_SIZE & PAGE_SHIFT & _AC()
    Memory layout of x86_64 in Linux
    Compile Linux Kernel on Ubuntu 12.04 LTS (Detailed)
    ret/retn人为改变执行地址
    [fw]LINUX中断描述符初始化
    查看x86主機是否支援64bit in Linux
    Linux.中断处理.入口x86平台entry_32.S
    [fW]中断处理函数数组interrupt[]初始化
    Linux GNU GAS introduction
    洛谷试炼场 3-5数论 3-17 倍增
  • 原文地址:https://www.cnblogs.com/patrickyu/p/3211115.html
Copyright © 2011-2022 走看看