扩展方法 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> 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

出处:http://www.cnblogs.com/jasonxuvip/

时间: 2024-10-07 17:16:22

扩展方法 DataTable To List<T>的相关文章

扩展方法 DataTable的ToList&lt;T&gt;

using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Reflection; namespace Extension { public static class Extension { public static IList<T> ToList<T>(this DataTable dt) { var l

c# 之DataTable的扩展方法

由于太懒了,很久没更新了.毕业了,得好好装逼学习了,不能一心想着完了. 由于公司中的项目大量的使用DataTable,而每次对datatable进行操作的时候需要写很多相同的代码,所以秉着 装逼而学习 的态度,于是撸了几个扩展方法,记录下来,学习下.     class Program     {         public DataTable LinqTable = new DataTable();         void AddNewRow(int id, string name)   

DataTable扩展方法ToList&lt;T&gt;()、ToJSON()、ToArrayList()

/// <summary> /// 扩展方法类 /// </summary> public static class CommonExtension { /// <summary> /// 数据类型对应转换方法字典 /// </summary> static Dictionary<Type, Func<object, object>> dic_convert = new Dictionary<Type, Func<obje

泛型List集合转化为DateTable的扩展方法

文章出处:http://www.codeproject.com/Tips/867866/Extension-Method-for-Generic-List-Collection-to-Da 这段代码是能够帮助你把泛型集合List转出成DataTable的扩展方法. 背景: 不知道你是否知道这个扩展方法,但是你可以不做任何修改的去使用下面这个类的代码. 使用代码:   using System; using System.Collections.Generic; using System.Comp

LINQ常用扩展方法

下面的方法都是IEnumerable<T>的扩展方法: Average计算平均值: Min最小元素:Max最大元素:Sum元素总和: Count元素数量: Concat连接两个序列://Unoin all Contains序列是否包含指定元素: Distinct取得序列中的非重复元素: Except获得两个序列的差集: Intersect获得两个序列的交集: First取得序列第一个元素: Single取得序列的唯一一个元素,如果元素个数不是1个,则报错:!!!严谨的程序. FirstOrDe

C# 3.0 特性之扩展方法

今天,我们来聊一聊C#的扩展方法. C# 3.0中为我们提供了一个新的特性—扩展方法.什么是扩展方法呢?我们看一下MSDN的注解: 扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型 也就是说,我们可以为基础数据类型,如:String,Int,DataRow,DataTable等添加扩展方法,也可以为自定义类添加扩展方法. 那么,我们怎么向现有类型进行扩展呢?我们再看看MSDN的定义: 扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的.

系统类扩展方法,实现对所有类或某种类扩展自定义方法

扩展方法的格式: 1.必须把扩展方法写在静态类中 2.扩展方法的第一个参数必须加 "this" 修饰 例如,对所有object对象的扩展方法IsEmptyOrNull,判断对象是否为空,object o 前加了this,所有Object对象都可调用此方法 public static bool IsEmptyOrNull(this object o){     return o == DBNull.Value || string.IsNullOrWhiteSpace(o?.ToStrin

C#中的反射和扩展方法的运用

前段时间做了一个练手的小项目,名叫Book_Bar,用来卖书的,采用的是三层架构,也就是Models,IDAL,DAL,BLL 和 Web , 在DAL层中各个类中有一个方法比较常用,那就是 RowToClass ,顾名思义,也就是将 DataTable 中的数据封装到 Models 中.结果导致在DAL各个类中写了很多类似的方法,后来就直接把它抽取出来做成了 DataTable和 DataRow的扩展方法, 下面是代码: using System; using System.Collectio

扩展方法(DateTableToList)

public static IList<T> ToList<T>(this DataTable dt) where T : class,new() { var prlist = new List<PropertyInfo>(); var t = typeof(T); Array.ForEach(t.GetProperties(), p => { if (dt.Columns.IndexOf(p.Name) != -1) prlist.Add(p); }); var