我有以下代碼能夠將Reader
映射到簡單對象。麻煩的是如果對象是合成的,它無法映射。我無法通過檢查屬性來執行遞歸,如果它是一類本身與複合C#對象映射器的通用關係
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值爲空(DBNull大小寫)時,您的策略不會將任何內容分配給屬性,這是略有缺陷的。對於例如假設你有一些值在默認構造函數中被賦值給一些公共屬性,比如「public T(){P = someValue;}」現在,如果屬性「P」是db中的DbNull,並且你沒有在映射中爲它分配任何東西代碼來處理空情況,然後映射器返回一個T,其中P = someValue(在構造函數中分配),而在db中它是DBNull。這些都是奇怪的情況,但仍然是爲了純潔... – nawfal