【发布时间】:2015-07-25 16:07:22
【问题描述】:
我有以下能够将Reader 映射到简单对象的代码。问题是如果对象是复合的,它就无法映射。如果属性本身是一个类,我无法通过检查属性来执行递归
prop.PropertyType.IsClass
因为类型需要调用DataReaderMapper()。关于如何实现这一点或其他方法的任何想法?另外,目前我不希望使用任何 ORM。
public static class MapperHelper
{
/// <summary>
/// extension Method for Reader :Maps reader to type defined
/// </summary>
/// <typeparam name="T">Generic type:Model Class Type</typeparam>
/// <param name="dataReader">this :current Reader</param>
/// <returns>List of Objects</returns>
public static IEnumerable<T> DataReaderMapper<T>(this IDataReader dataReader)where T : class, new()
{
T obj = default(T);
//optimized taken out of both foreach and while loop
PropertyInfo[] PropertyInfo;
var temp = typeof(T);
PropertyInfo = temp.GetProperties();
while (dataReader.Read())
{
obj = new T();
foreach (PropertyInfo prop in PropertyInfo)
{
if (DataConverterHelper.ColumnExists(dataReader,prop.Name) && !dataReader.IsDBNull(prop.Name))
{
prop.SetValue(obj, dataReader[prop.Name], null);
}
}
yield return obj;
}
}
}
【问题讨论】:
-
请注意,当 db 值为 null(DBNull 情况)时,您根本不向属性分配任何内容的策略存在轻微缺陷。例如假设您在默认构造函数中为某些公共属性分配了一些值,例如“public T() { P = someValue; }” 现在如果属性“P”是 db 中的 DbNull 并且您没有在映射中为其分配任何内容处理 null 情况的代码,然后映射器返回一个 T,其中 P = someValue(在构造函数中分配),而在 db 中它是 DBNull。这些是奇怪的情况,但仍然是为了纯洁......
标签: c# datareader