C#高级特性之 泛型 扩展方法 Lamda表达式
泛型概念:类型参数使得设计如下类和方法成为可能:这些类和方法将一个或多个类型的指定推迟到客户端代码声明并实例化该类或方法的时候。例如,通过使用泛型类型参数T,可以编写其他客户端代码能够使用的单个类,而不致引入运行时强制转换或装箱操作的成本或风险。
(一)泛型类和方法
1.1 default关键字
在泛型类和泛型方法中产生的一个问题是,在预先未知以下情况时,如何将默认值分配给参数化类型T,T是引用类型还是值类型。如果T为值类型,则它是数值还是结构。
给定参数化类型T的一个变量t,
① 当T为引用类型时:t=null 有效
② 当T为数值类型而不为结构体时:t=0有效
解决方案是使用 default 关键字,此关键字对于引用类型会返回null,对于数值类型会返回零。对于结构,此关键字将返回初始化为零或 null 的每个结构成员,具体取决于这些结构是值类型还是引用类型。
1.2 类型参数T的创建
代码①和②处表明了两种创建泛型参数T的两种方式。
代码public List<T> ExecuteObject<T>(DbCommand cmd) { DataTable dt=ExecuteDataTable(cmd); List<T> list = new List<T>(); foreach (DataRow dr in dt.Rows) { //T model = new T(); ① T model = (T)Activator.CreateInstance(typeof(T)); //② for (int i = 0; i < dt.Columns.Count; i++) { PropertyInfo propertyInfo = model.GetType().GetProperty(dr.Table.Columns[i].ColumnName); if (propertyInfo != null && dr[i] != DBNull.Value) propertyInfo.SetValue(model, dr[i], null); } list.Add(model); } return list; }