• 利用委托反射将DataTable转换为实体集


    类泛型的约束:

    1 public static class ToModel<T> where T : class, new()

    定义委托:

    1 public delegate void SetString(string value);

    创建委托方法:

    1 private static SetString CreateStringDelegate(T model, string propertyName)
    2 {
    3    MethodInfo mi = model.GetType().GetProperty(propertyName).GetSetMethod();
    4    Type type = typeof(SetString);
    5    return Delegate.CreateDelegate(type, model, mi) as SetString;
    6  }

    利用反射和委托将DataTable转换为实体集:

     1         public static IList<T> GetDelegate_ToModelList(DataTable dt)
     2         {
     3             IList<T> list = new List<T>();
     4             if (dt == null || dt.Rows.Count < 1) return list;
     5             SetString setDelegateString;
     6             foreach (DataRow dr in dt.Rows)
     7             {
     8                 T model = new T();
     9                 foreach (DataColumn dc in dt.Columns)
    10                 {
    11                     setDelegateString = CreateStringDelegate(model, dc.ColumnName);
    12                     setDelegateString(dr[dc.ColumnName].ToString());
    13                 }
    14                 list.Add(model);
    15             }
    16             return list;
    17         }

    这样写问题就来了,因为委托定义的参数时string类型的,因为我们实体中可能有int或者DateTime类型的,这时就需要用上泛型委托了

    如果这样定义委托:

    1 public delegate void SetString<PT>(PT value)

    创建委托方法(这里有问题,不知如何处理):

    1         private static SetString CreateStringDelegate(T model, string propertyName)
    2         {
    3             MethodInfo mi = model.GetType().GetProperty(propertyName).GetSetMethod();
    4             Type type = typeof(model).GetProperty(propertyName).PropertyType;
    5             return Delegate.CreateDelegate(type, model, mi) as SetString<type>;
    6         }

    利用反射和委托将DataTable转换为实体集:

     1         public static IList<T> GetDelegate_ToModelList(DataTable dt)
     2         {
     3             IList<T> list = new List<T>();
     4             if (dt == null || dt.Rows.Count < 1) return list;
     5             foreach (DataRow dr in dt.Rows)
     6             {
     7                 T model = new T();
     8                 foreach (DataColumn dc in dt.Columns)
     9                 {
    10                     SetString<typeof(T).GetProperty(dc.ColumnName).PropertyType> setDelegateString = CreateStringDelegate(model, dc.ColumnName);
    11                     setDelegateString(dr[dc.ColumnName].ToString());
    12                 }
    13                 list.Add(model);
    14             }
    15             return list;
    16         }

    一直疑惑着,希望有人帮我解决疑惑,直接反射的方法我也有,但是这个问题不解决,心里一直有疙瘩,希望有人帮帮忙,谢谢!

  • 相关阅读:
    Java数据结构与算法(24)
    urllib2使用总结
    Python常见文件操作的函数示例
    Java数据结构与算法(23)
    python代码风格检查工具──pylint
    Python抓取框架:Scrapy的架构
    Java数据结构与算法(22)
    【codeforces 431D】Random Task
    【codeforces 449C】Jzzhu and Apples
    【codeforces 20B】Equation
  • 原文地址:https://www.cnblogs.com/cmsdn/p/2457135.html
Copyright © 2020-2023  润新知