在循环DataTable中的每一行时调用该方法,可避免实体类属性众多时手动赋值的麻烦。
1.有返回值版本,该版本需要注意的是,普通情况下的泛型没有构造器,无法直接通过new关键字实例化,所以需要在方法签名后面加上 where T : new(),为方法内的所有泛型变量添加一个空构造器,使之可以实例化。它最终的效果是实例化实体类并且赋值,然后return赋值结果。
public static T SetValueForEntityByData<T>(DataRow dr) where T : new()
{
T Entity = new T();
PropertyInfo[] propertyInfo = Entity.GetType().GetProperties();
Type type = Entity.GetType();
foreach (PropertyInfo item in propertyInfo)
{
item.SetValue(Entity, Convert.ChangeType(dr[item.Name], item.PropertyType));
}
return Entity;
}
2.无返回值版本,不用担心泛型的实例化,省略where,但是需要能理解引用类型与值类型在内存上的储存方式的区别。它最终的效果是为传入的实体类赋值,并且赋值结果不用经过return便可以体现。
public static void SetValueForEntityByData<T>(T Entity,DataRow dr)
{
Type type = typeof(T);
PropertyInfo[] propertyInfo = Entity.GetType().GetProperties();
foreach (PropertyInfo item in propertyInfo)
{
item.SetValue(Entity, Convert.ChangeType(dr[item.Name], item.PropertyType));
}
}