C# – IDataReader到使用泛型的对象映射

前端之家收集整理的这篇文章主要介绍了C# – IDataReader到使用泛型的对象映射前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如何使用泛型将DataReader对象映射到类对象?

例如我需要执行以下操作:

  1. public class Mapper<T>
  2. {
  3. public static List<T> MapObject(IDataReader dr)
  4. {
  5. List<T> objects = new List<T>();
  6.  
  7. while (dr.Read())
  8. {
  9. //Mapping goes here...
  10. }
  11.  
  12. return objects;
  13. }
  14. }

后来我需要调用这个类方法,如下所示:

  1. IDataReder dataReader = DBUtil.Fetchdata("SELECT * FROM Book");
  2.  
  3. List<Book> bookList = Mapper<Book>.MapObject(dataReder);
  4.  
  5. foreach (Book b in bookList)
  6. {
  7. Console.WriteLine(b.ID + "," + b.BookName);
  8. }

请注意,Mapper类应该能够映射由T表示的任何类型的对象.

解决方法

我用这个 ValueInjecter

我这样做:

  1. while (dr.Read())
  2. {
  3. var o = new User();
  4. o.InjectFrom<DataReaderInjection>(dr);
  5. yield return o;
  6. }

你会需要这个ValueInjection来工作:

  1. public class DataReaderInjection : KnownSourceValueInjection<IDataReader>
  2. {
  3. protected override void Inject(IDataReader source,object target,PropertyDescriptorCollection targetProps)
  4. {
  5. for (var i = 0; i < source.FieldCount; i++)
  6. {
  7. var activeTarget = targetProps.GetByName(source.GetName(i),true);
  8. if (activeTarget == null) continue;
  9.  
  10. var value = source.GetValue(i);
  11. if (value == DBNull.Value) continue;
  12.  
  13. activeTarget.SetValue(target,value);
  14. }
  15. }
  16. }

猜你在找的C#相关文章