BaseModel是作为实体类的父类,用于存放公共字段,可根据需求进行调整
第一种:
需要注意的是:如果泛型没有约束,那么是不能和as运算符一起使用
特别注意:你的实体类的属性名字必须和数据库的字段名字一样,因为对属性赋值的时候,使用的是属性名字进行的映射
public static class Reflect<T> where T : BaseModel
{
public static T GetModel(SqlDataReader reader)
{
Type type = typeof(T);//获取类型
var pro = type.GetProperties();//获取该类型的公共属性
T t=Activator.CreateInstance(type) as T;//创建该类型的对象
foreach (var item in pro)//遍历对象的属性
{
if(!typeof(BaseModel).IsAssignableFrom(item.PropertyType))//如果是其他实体类就不加载
item.SetValue(t, reader[item.Name]);//对对象的属性赋值
}
return t;
}
}
调用Reflect:
var reader=SQLHelper.ExecuteReader("select * from Users");
List<Usere> li = new List<Usere>();
while (reader.Read())
{
li.Add(Reflect<Usere>.GetModel(reader));
}
第二种:
如果你的实体类和你的数据库字段差别太大,那么你可以再加一层循环,
显然这种方法的效率比第一种低
public static class Reflect<T> where T : BaseModel
{
public static T GetModel(SqlDataReader reader)
{
Type type = typeof(T);
var pro = type.GetProperties();
T t = Activator.CreateInstance(type) as T;
foreach (var item in pro)
{
for (int i = 0; i < reader.FieldCount; i++)//遍历reader中的字段名字
{
if(item.Name==reader.GetName(i))//如果实体类和reader中有这个字段在为它赋值
item.SetValue(t, reader[item.Name] == DBNull.Value ? null : reader[item.Name]);
}
}
return t;
}
}
第三种:如果你的实体类名字和数据库不一致
你可以增加一个特性(Attribute)来标识数据库中字段的名字