进入C#学习以后,就接触到了泛型集合,在机房的个人重构中在返回值类型需要表的时候有两种:一种是datatable,一种是list<>。
List就是我们所说的泛型,List,就是指没有确定的类型,泛型的参数是类。
应用中,在机房重构过程中,想要运用list需要把list看成是一个容器,将我们需要的信息或类放进去。其次难点为:如何把我们的类装进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; //获得属性名称
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;//返回泛型集合
```我们来聊一聊Where T:New()
它被称为泛型约束,即限制T必须为具有公共无参数构造函数。主要是针对类型参数的类型限制。 如果使用约束所不允许的类型来实例化类,会产生编译错误。
例外还有:Where T:结构(限制T实例化必须为值类型)、Where T:类、Where T:接口等多种。
所以在上述的代码中,我们使用的T为实体类,就要求实体类的属性与Datatable的数据类型相同。
最后来聊一聊泛型的优点
在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,代码的重用率高 。参数类型的置顶将退拆到客户端代码的声明并实例化该类或方法的时候。减少因强制转换或装箱操作带来的风险。