Mapeamento de IDataReader para Objeto usando genéricos

Como posso mapear um objeto DataReader para um objeto de classe usando genéricos?

Por exemplo, preciso fazer o seguinte:

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;
        }
    }

E mais tarde eu preciso chamar este método de classe como o seguinte:

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);
}

Note que, a classe Mapper deve ser capaz de mapear objetos de qualquer tipo representados por T.