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

标签 c# ado.net mapping automapping

如何使用泛型将 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);
            }
        }
    }

关于C# - IDataReader 到使用泛型的对象映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1105549/

相关文章:

mysql - Grails 数据库映射

c# - 有没有办法从 .cs 文件中获取函数列表?

c# - NextResult 和 MARS 的区别

sql-server - 如何让 Entity Framework 1.0 在访问特定实体时使用 nolock 提示

c# - 即席查询字符串导致语法错误

c# - Elasticsearch Nest C#— ElasticProperty Analyzer导致动态映射

c# - Resharper(查找并)一次修复所有问题

c# - 如何防止 Visual Studio 显示应用程序洞察提醒?

c# - 如何确定所有任务何时完成

mapping - 获取 Leaflet LayerGroup 大小的简单方法?