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

转载于:https://www.cnblogs.com/KQNLL/p/4302600.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以回答你的问题。利用反射可以实现 DataTableList<T> 之间的转换。 首先,我们需要定义一个通用的方法,该方法可以将 List<T> 转换为 DataTable,也可以将 DataTable 转换为 List<T>。该方法的实现需要借助反射机制。 下面是将 List<T> 转换为 DataTable 的代码: ```csharp public static DataTable ConvertToDataTable<T>(List<T> list) { DataTable table = new DataTable(); PropertyInfo[] properties = typeof(T).GetProperties(); foreach (PropertyInfo property in properties) { table.Columns.Add(property.Name, property.PropertyType); } foreach (T item in list) { DataRow row = table.NewRow(); foreach (PropertyInfo property in properties) { row[property.Name] = property.GetValue(item, null); } table.Rows.Add(row); } return table; } ``` 上面的代码中,我们首先使用反射机制获取型 T 的所有属性信息,然后使用这些属性信息创建 DataTable 的列。接着,我们遍历 List<T> 中的每个元素,使用反射获取元素的属性值,并将这些属性值添加到 DataRow 中,最后将 DataRow 添加到 DataTable 中。 下面是将 DataTable 转换为 List<T> 的代码: ```csharp public static List<T> ConvertToList<T>(DataTable table) where T : new() { List<T> list = new List<T>(); PropertyInfo[] properties = typeof(T).GetProperties(); foreach (DataRow row in table.Rows) { T item = new T(); foreach (PropertyInfo property in properties) { if (table.Columns.Contains(property.Name)) { property.SetValue(item, row[property.Name], null); } } list.Add(item); } return list; } ``` 上面的代码中,我们同样使用反射机制获取型 T 的所有属性信息,然后遍历 DataTable 中的每个 DataRow,使用反射设置每个 DataRow 中对应的属性值,并将 T 对象添加到 List<T> 中。 希望这些代码可以帮助你解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值