在网上查了一下,发现有些人写的效率不高.自己修改了一下.
根据select出来的字段去反射.
public static T ReaderToModel<T>(IDataReader dr)
{
try
{
using (dr)
{
if (dr.Read())
{
Type modelType = typeof(T);
T model = Activator.CreateInstance<T>();
for (int i = 0; i < dr.FieldCount; i++)
{
PropertyInfo pi = modelType.GetProperty(GetPropertyName(dr.GetName(i)));
pi.SetValue(model, HackType(dr[i], pi.PropertyType), null);
}
return model;
}
}
return default(T);
}
catch (Exception ex)
{
throw ex;
}
}
public static List<T> ReaderToList<T>(IDataReader dr)
{
using (dr)
{
List<T> list = new List<T>();
Type modelType = typeof(T);
while (dr.Read())
{
T model = Activator.CreateInstance<T>();
for (int i = 0; i < dr.FieldCount; i++)
{
PropertyInfo pi = modelType.GetProperty(GetPropertyName(dr.GetName(i)));
pi.SetValue(model, HackType(dr[i], pi.PropertyType), null);
}
list.Add(model);
}
return list;
}
}
//这个类对可空类型进行判断转换,要不然会报错
private static object HackType(object value, Type conversionType)
{
if (conversionType.IsGenericType && conversionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
{
if (value == null)
return null;
System.ComponentModel.NullableConverter nullableConverter = new System.ComponentModel.NullableConverter(conversionType);
conversionType = nullableConverter.UnderlyingType;
}
return Convert.ChangeType(value, conversionType);
}
private static bool IsNullOrDBNull(object obj)
{
return ((obj is DBNull) || string.IsNullOrEmpty(obj.ToString())) ? true : false;
}
//取得DB的列对应bean的属性名
private static string GetPropertyName(string column)
{
column = column.ToLower();
string[] narr = column.Split('_');
column = "";
for (int i = 0; i < narr.Length; i++)
{
if (narr[i].Length > 1)
{
column += narr[i].Substring(0, 1).ToUpper() + narr[i].Substring(1);
}
else
{
column += narr[i].Substring(0, 1).ToUpper();
}
}
return column;
}
分享到:
相关推荐
通过这样的方法,我们可以轻松地将数据库查询结果转换为任何预先定义好的实体类,无需为每种类型编写单独的映射代码。这在处理大量不同结构的数据时非常有用,提高了代码的可维护性和可扩展性。
C#中的类是面向对象编程的基础,它们封装了数据和方法,可以代表现实世界中的实体或者抽象的概念。在这个项目中,类文件可能被用来表示数据库中的表或记录。通过读取数据库中的信息,开发者可以动态地生成对应的类...
提示:用DataReader去访问数据库,将得到的结果通过反射生成实体对象/集合返回; 4 封装一个方法,能控制台输出任意实体的全部属性和属性值; 5 进阶需求:提供泛型的数据库实体插入、实体更新、ID删除数据的数据库...
3. 反射和序列化:反射提供了封装程序集、模块和类型的对象,可以动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。序列化是将对象转换为易于传输的格式的过程。 4. sealed 修饰符:sealed ...
- 反射允许在运行时动态创建对象、获取类型信息并调用成员。 - 序列化是将对象状态转化为可持久化的格式,反序列化则是从该格式恢复对象状态。 16. O/R Mapping原理: O/R Mapping(对象关系映射)通过配置将...
它通过配置文件或者代码的方式定义实体类与数据库表之间的映射关系,使得开发人员可以使用面向对象的方式来操作数据库,而不需要编写 SQL 语句。 #### 6. 类成员的访问控制 - **Public**:公开访问,任何地方都...
9.1.1 用SystemInformation类获取系统信息 356 9.1.2 用Environment 类获取系统信息 357 9.1.3 通过WMI获取系统信息 358 9.1.4 用RegistryKey 类读取系统信息 361 9.1.5 用API函数获取系统信息 363 9.1.6 获取系统...
9.1.1 用SystemInformation类获取系统信息 356 9.1.2 用Environment 类获取系统信息 357 9.1.3 通过WMI获取系统信息 358 9.1.4 用RegistryKey 类读取系统信息 361 9.1.5 用API函数获取系统信息 363 9.1.6 获取系统...
抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。 41.构造器Constructor是否可被override? 答:构造器Constructor不能被继承,因此不能重写Overriding,但可以被...