zoukankan      html  css  js  c++  java
  • 扩展方法 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 { getset; }
            public String DestNumber { getset; }
            public String Content { getset; }
            public String SmsId { getset; }
            public String UserName { getset; }
            public String Password { getset; }
        }

    扩展前代码: 

      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> List<T>(this 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 list2=   dt.List<SendMsgModel>();

    三、比较

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

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

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

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



    作者:JasonXuVip
    我的网址:政和生活网
    本文地址:
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

  • 相关阅读:
    转角色权限系统的一些概念
    error message cs0012
    关于Action返回结果类型的事儿(下)
    MVC中权限的知识点及具体实现代码
    iis7 发布mvc3 遇到的HTTP错误 403.14Forbidden Web 服务器被配置为不列出此目录的内容及Login on failed for "IIS APPPOOL\ASP.NET v4.0"问题
    关于获取时间段的整理片段
    ASP.NET MVC – 关于Action返回结果类型的事儿(上)
    Lucene 查询权重排序因子解释(备查)
    Lucene代替SQL Server NewGuid获取随机结果
    如何在Web数据挖掘中保证用户访问速度的一点实践(SQLite+Quartz)
  • 原文地址:https://www.cnblogs.com/jasonxuvip/p/2621674.html
Copyright © 2011-2022 走看看