Ho il seguente codice che è in grado di mappare Reader
in oggetti semplici. Il problema è che se l'oggetto è composto non riesce a mappare. Io non sono in grado di eseguire la ricorsione verificando la proprietà se si tratta di una classe stessaMappatore oggetti relazionale generico C#
prop.PropertyType.IsClass come tipo è necessaria per chiamare DataReaderMapper()
. Qualche idea su come questo possa essere raggiunto o qualche altro approccio? Inoltre, attualmente non desidero utilizzare alcun 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;
}
}
}
Si noti che la propria strategia non assegna nulla alla proprietà quando il valore db è nullo (caso DBNull) è leggermente imperfetto. Ad es. Supponiamo che tu abbia un valore assegnato ad alcune proprietà pubbliche nel costruttore predefinito, come "public T() {P = someValue;}" Ora se la proprietà "P" è DbNull in db e non stai assegnando nulla ad essa nella tua mappatura codice per gestire i casi null, quindi il mapper restituisce una T dove P = someValue (assegnato nel costruttore) mentre in db è DBNull. Questi sono casi strani ma ancora per motivi di purezza ... – nawfal