扩展方法 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 的感觉?

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

posted @ 2012-08-03 15:19  po~饭盒  阅读(6312)  评论(2编辑  收藏  举报