生活很精彩,所以我自己创造自己的喜欢的东西,或取之有方。
有时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 的感觉?
之后继续慢慢积累,对于性能方面还没有研究,应该也不赖吧.