加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 03:50:53 所属栏目:百科 来源:网络整理
导读:如何使用泛型将DataReader对象映射到类对象? 例如我需要执行以下操作: public class MapperT { public static ListT MapObject(IDataReader dr) { ListT objects = new ListT(); while (dr.Read()) { //Mapping goes here... } return objects; } } 后来我
如何使用泛型将DataReader对象映射到类对象?

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

public class Mapper<T>
    {
        public static List<T> MapObject(IDataReader dr)
        {
            List<T> objects = new List<T>();

            while (dr.Read())
            {
                //Mapping goes here...
            }

            return objects;
        }
    }

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

IDataReder dataReader = DBUtil.Fetchdata("SELECT * FROM Book");

List<Book> bookList = Mapper<Book>.MapObject(dataReder);

foreach (Book b in bookList)
{
     Console.WriteLine(b.ID + "," + b.BookName);
}

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

解决方法

我用这个 ValueInjecter

我这样做:

while (dr.Read())
  {
      var o = new User();
      o.InjectFrom<DataReaderInjection>(dr);
      yield return o;
  }

你会需要这个ValueInjection来工作:

public class DataReaderInjection : KnownSourceValueInjection<IDataReader>
    {
        protected override void Inject(IDataReader source,object target,PropertyDescriptorCollection targetProps)
        {
            for (var i = 0; i < source.FieldCount; i++)
            {
                var activeTarget = targetProps.GetByName(source.GetName(i),true);
                if (activeTarget == null) continue;

                var value = source.GetValue(i);
                if (value == DBNull.Value) continue;

                activeTarget.SetValue(target,value);
            }
        }
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读