• 扩展方法 DataTable To List<T>


    生活很精彩,所以我自己创造自己的喜欢的东西,或取之有方。
    有时code累,重复的东西也多...也不是很美观,怎么样让自己更爽赶快顺手的编码呢....
    所以扩展方法也来了..

    一、扩展方法描述一方:

    扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。 对于用 C# 和 Visual Basic 编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异。
    扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的。 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。 仅当您使用 using 指令将命名空间显式导入到源代码中之后,扩展方法才位于范围中。

    可以使用扩展方法来扩展类或接口,但不能重写扩展方法。 与接口或类方法具有相同名称和签名的扩展方法永远不会被调用。 编译时,扩展方法的优先级总是比类型本身中定义的实例方法低。 换句话说,如果某个类型具有一个名为Process(int i) 的方法,而您有一个具有相同签名的扩展方法,则编译器总是绑定到该实例方法。 当编译器遇到方法调用时,它首先在该类型的实例方法中寻找匹配的方法。 如果未找到任何匹配方法,编译器将搜索为该类型定义的任何扩展方法,并且绑定到它找到的第一个扩展方法。 下面的示例演示编译器如何确定要绑定到哪个扩展方法或实例方法。

    二、实例Demo 之 DataTable=>List<T>

    1.不说大家只说我自己,平时在项目中都会从数据库中获取数据DataTable,然后转换成对应的实体对象列表。【这里实体的字段名和DataTable列名是对应的】

    实体类:

     
     public class SendMsgModel
        {
            public int Id { get; set; }
            public String DestNumber { get; set; }
            public String Content { get; set; }
            public String SmsId { get; set; }
            public String UserName { get; set; }
            public String Password { get; set; }
        }
     

    扩展前代码: 

     
     public class ToObject
        {
     
            /// <summary>
            /// 
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="dt"></param>
            /// <returns></returns>
            public static List<T> List<T>(DataTable dt)
            {
                var list = new List<T>();
                Type t = typeof (T);
                var plist = new List<PropertyInfo>(typeof (T).GetProperties());
     
                foreach (DataRow item in dt.Rows)
                {
                    T s = System.Activator.CreateInstance<T>();
                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        PropertyInfo info = plist.Find(p => p.Name == dt.Columns[i].ColumnName);
                        if (info != null)
                        {
                            if (!Convert.IsDBNull(item[i]))
                            {
                                info.SetValue(s, item[i], null);
                            }
                        }
                    }
                    list.Add(s);
                }
                return list;
            }
        }

    调用:

         

      DataTable dt= odbc.ExecuteDataTable(@"select top(100) Id , DestNumber  , Content  , SmsId  , UserName  , Password   from Send";
            var list=ToObject.List<SendMsgModel>(dt);

     

    扩展后代码:

     
     /// <summary>
        /// 扩展类
        /// </summary>
        public static class Extension
        {
    
            /// <summary>
            /// 
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="dt"></param>
            /// <returns></returns>
            public static List<T> GetMyList<T>(this DataTable dt)
            {
                var list = new List<T>();          
                var plist = new List<PropertyInfo>(typeof(T).GetProperties());
                foreach (DataRow item in dt.Rows)
                {
                    T s = System.Activator.CreateInstance<T>();
                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        PropertyInfo info = plist.Find(p => p.Name.ToUpper() == dt.Columns[i].ColumnName);
                        if (info != null)
                        {
                            if (!Convert.IsDBNull(item[i]))
                            {
                                string type = dt.Columns[i].DataType.ToString();
                                if (type == "System.DateTime")
                                {
                                    string temp = item[i].ToString().Trim();
                                    DateTime defaults;
                                    DateTime.TryParse(temp, out defaults);
                                    string timeFomate = "";
                                    if (defaults != null)
                                    {
                                        timeFomate = defaults.ToString("yyyy-MM-dd HH:mm:ss");
                                    }
                                    info.SetValue(s, timeFomate, null);
                                }
                                else
                                {
                                    info.SetValue(s, item[i].ToString().Trim(), null);
                                }
                            }
                            else
                            {
                                info.SetValue(s, "", null);
                            }
                        }
                    }
                    list.Add(s);
                }
                return list;
            }   
    
        }

         
    调用:

     
     DataTable dt= odbc.ExecuteDataTable(@"select top(100) Id , DestNumber  , Content  , SmsId  , UserName  , Password   from Send";
      var list2=   dt.List<SendMsgModel>();

    三、比较

      1. 前 var list=ToObject.List<SendMsgModel>(dt);

      2. 后 var list2=   dt.List<SendMsgModel>();

      使用风格上是不是就很大区别了?自己感受哈。Linq 的感觉?

      之后继续慢慢积累,对于性能方面还没有研究,应该也不赖吧.


    作者:JasonXuVip
  • 相关阅读:
    C# WinForm TextBox 作为密码输入框时,如何禁止密码查看器获取密码 ?
    .net 程序运行在不同框架版本下的支持配置(主要是.net4.0 与 .net2.0的兼容)
    比较C#的静态常量(const)和动态常量(static和readonly)
    Linux 本地yum源 、阿里yum源、163yum源的配置安装
    Mysql 单机数据库迁移几种方式
    sed中使用变量及变量中存在特殊字符‘/’处理
    Linux下安装zookeeper、配置zookeeper开机自启动
    MySQL 不同场景下的迁移方案(转载)
    配置YUM源出现Errno 14 Could not open/read repomd.xml 或者 "Couldn't open file /mnt/cdrom/repodata/repomd.xml" 错误的解决办法
    Docker安装Rabbitmq并实现挂载宿主机数据目录
  • 原文地址:https://www.cnblogs.com/KQNLL/p/4302600.html
Copyright © 2020-2023  润新知