泛型集合
机房重构中已经使用过泛型,但理解不太深刻,借着进行机房合作的机会将错过的知识再补充一下。
首先清楚的理解以下的几组概念:
一、集合—装箱和拆箱(ArrayList)
集合,就是包含多个数据类型的类。
装箱:就是把不同种类型(值类型等)打包到Object对象中。
拆箱:相反,从object中强制转换为所存的数据的本来类型(值类型等)
二、泛型(List)
泛型,就是指没有确定的类型,编码含参数类型的类型,泛型的参数只可以是类。编码含参数的类,则可以是类或对象。
泛型应用
public List<T> convertToList<T>(DataTable dt) where T : new()
{
//T在这里默认为本系统定义的实体
List<T> ts = new List<T>(); //定义集合,元素为实体属性
Type type = typeof(T); //获得实体的类型
string tempName = string.Empty; //定义一个为空的临时变量
foreach(DataRow dr in dt.Rows) //遍历datatable中的数据行
{
T t = new T();//实例化实体,得到对象t
PropertyInfo[] propertys = t.GetType().GetProperties();//获得t所有公共属性
foreach(PropertyInfo pi in propertys) //遍历t的所有属性
{
tempName = pi.Name; //获得属性名称
//datatable中是否包含该列,t的属性名称==表的列名称?
if (dt.Columns.Contains(tempName))
{
if (!pi.CanWrite) continue; //如果该t的属性为不可写,则直接跳出
object value = dr[tempName];//获得列=tempName的所有数据
if (value != DBNull.Value)//如果非空
pi.SetValue(t, value, null);//利用反射,动态的对t的属性赋值。
}
}
ts.Add(t);//将t加入到集合
}
return ts;//返回泛型集合
}
泛型解释
一、T通用数据类型T作为一个占位符,等待在实例化时用一个实际的类型来代替.C# 泛型类在编译时,先生成中间代码L,在实例化类时,根据用户指定的数据类型(一般我们刚开始接触的就是实体类)代替T并由JIT生成本地代码。
二、Where T:New()
这种行为成为称为泛型约束,即限制T必须为具有公共无参数构造函数。主要是针对类型参数的类型限制。 如果使用约束所不允许的类型来实例化类,会产生编译错误。例外还有:Where T:结构(限制T实例化必须为值类型)、Where T:类、Where T:接口等多种。
三、所以在上述的代码中,我们使用的T为实体类,就要求 实体类的属性与Datatable的数据类型相同。
泛型优点
是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,代码的重用率高 。参数类型的置顶将退拆到客户端代码的声明并实例化该类或方法的时候。减少因强制转换或装箱操作带来的风险。