title: Class Mapping Error: 'T' must be a non-abstract type with a public parameterless constructor
body: <p>While mapping class i am getting error 'T' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'T' in the generic type or method.</p>
  
  <p>Below is my SqlReaderBase Class</p>
  
  <pre><code> public abstract class SqlReaderBase&lt;T&gt; : ConnectionProvider
      {
  
          #region  Abstract Methods
  
          protected abstract string commandText { get; }
          protected abstract CommandType commandType { get; }
          protected abstract Collection&lt;IDataParameter&gt; GetParameters(IDbCommand command);
          **protected abstract MapperBase&lt;T&gt; GetMapper();**
  
          #endregion
  
          #region Non Abstract Methods
  
          /// &lt;summary&gt;
          /// Method to Execute Select Queries for Retrieveing List of Result
          /// &lt;/summary&gt;
          /// &lt;returns&gt;&lt;/returns&gt;
          public Collection&lt;T&gt; ExecuteReader()
          {
              //Collection of Type on which Template is applied
              Collection&lt;T&gt; collection = new Collection&lt;T&gt;();
  
              // initializing connection
              using (IDbConnection connection = GetConnection())
              {
                  try
                  {
                      // creates command for sql operations
                      IDbCommand command = connection.CreateCommand();
  
                      // assign connection to command
                      command.Connection = connection;
  
                      // assign query
                      command.CommandText = commandText;
  
                      //state what type of query is used, text, table or Sp 
                      command.CommandType = commandType;
  
                      // retrieves parameter from IDataParameter Collection and assigns it to command object
                      foreach (IDataParameter param in GetParameters(command))
                          command.Parameters.Add(param);
  
  
                      // Establishes connection with database server
                      connection.Open();
  
                      // Since it is designed for executing Select statements that will return a list of results 
                      // so we will call command's execute  reader method that return a Forward Only reader with 
                      // list of results inside. 
                      using (IDataReader reader = command.ExecuteReader())
                      {
                          try
                          {
                              // Call to Mapper Class of the template to map the data to its 
                              // respective fields
                              MapperBase&lt;T&gt; mapper = GetMapper();
                              collection = mapper.MapAll(reader);
  
                          }
                          catch (Exception ex)            // catch exception
                          {
                              throw ex;     // log errr
                          }
                          finally
                          {
                              reader.Close();
                              reader.Dispose();
                          }
                      }
                  }
                  catch (Exception ex)
                  {
                      throw ex;
                  }
                  finally
                  {
                      connection.Close();
                      connection.Dispose();
                  }
              }
              return collection;
          }
          #endregion
      }
  </code></pre>
  
  <p>What I am trying to do is , I am executine some command and filling my class dynamically. The class is given below:</p>
  
  <pre><code>namespace FooZo.Core
  {
      public class Restaurant
      {
  
  
          #region Private Member Variables
          private int _restaurantId = 0;
          private string _email = string.Empty;
          private string _website = string.Empty;
          private string _name = string.Empty;
          private string _address = string.Empty;
          private string _phone = string.Empty;
          private bool _hasMenu = false;
          private string _menuImagePath = string.Empty;
          private int _cuisine = 0;
          private bool _hasBar = false;
          private bool _hasHomeDelivery = false;
          private bool _hasDineIn = false;
          private int _type = 0;
          private string _restaurantImagePath = string.Empty;
          private string _serviceAvailableTill = string.Empty;
          private string _serviceAvailableFrom = string.Empty;
  
          public string Name
          {
              get { return _name; }
              set { _name = value; }
          }
  
          public string Address
          {
              get { return _address; }
              set { _address = value; }
          }
          public int RestaurantId
          {
              get { return _restaurantId; }
              set { _restaurantId = value; }
          }
          public string Website
          {
              get { return _website; }
              set { _website = value; }
          }
  
          public string Email
          {
              get { return _email; }
              set { _email = value; }
          }
          public string Phone
          {
              get { return _phone; }
              set { _phone = value; }
          }
  
          public bool HasMenu
          {
              get { return _hasMenu; }
              set { _hasMenu = value; }
          }
  
          public string MenuImagePath
          {
              get { return _menuImagePath; }
              set { _menuImagePath = value; }
          }
  
          public string RestaurantImagePath
          {
              get { return _restaurantImagePath; }
              set { _restaurantImagePath = value; }
          }
  
          public int Type
          {
              get { return _type; }
              set { _type = value; }
          }
  
          public int Cuisine
          {
              get { return _cuisine; }
              set { _cuisine = value; }
          }
  
          public bool HasBar
          {
              get { return _hasBar; }
              set { _hasBar = value; }
          }
  
          public bool HasHomeDelivery
          {
              get { return _hasHomeDelivery; }
              set { _hasHomeDelivery = value; }
          }
  
          public bool HasDineIn
          {
              get { return _hasDineIn; }
              set { _hasDineIn = value; }
          }
  
          public string ServiceAvailableFrom
          {
              get { return _serviceAvailableFrom; }
              set { _serviceAvailableFrom = value; }
          }
  
          public string ServiceAvailableTill
          {
              get { return _serviceAvailableTill; }
              set { _serviceAvailableTill = value; }
          }
  
  
          #endregion
  
          public Restaurant() { }
  
      }
  }
  </code></pre>
  
  <p>For filling my class properties dynamically i have another class called MapperBase Class with following methods:</p>
  
  <pre><code> public abstract class MapperBase&lt;T&gt; where T : new()
      {
          protected T Map(IDataRecord record)
          {
             T  instance = new T();
  
              string fieldName;
              PropertyInfo[] properties = typeof(T).GetProperties();
  
              for (int i = 0; i &lt; record.FieldCount; i++)
              {
                  fieldName = record.GetName(i);
  
                  foreach (PropertyInfo property in properties)
                  {
                      if (property.Name == fieldName)
                      {
                          property.SetValue(instance, record[i], null);
                      }
                  }
              }
  
              return instance;
          }
          public Collection&lt;T&gt; MapAll(IDataReader reader)
          {
              Collection&lt;T&gt; collection = new Collection&lt;T&gt;();
  
              while (reader.Read())
              {
  
                      collection.Add(Map(reader));
  
              }
  
              return collection;
          }
  
      }
  </code></pre>
  
  <p>There is another class which inherits the SqlreaderBaseClass called DefaultSearch. Code is below</p>
  
  <pre><code> public class DefaultSearch: SqlReaderBase&lt;Restaurant&gt;
  {
      protected override string commandText
      {
          get { return "Select Name from vw_Restaurants"; }
      }
  
      protected override CommandType commandType
      {
          get { return CommandType.Text; }
      }
  
      protected override Collection&lt;IDataParameter&gt; GetParameters(IDbCommand command)
      {
          Collection&lt;IDataParameter&gt; parameters = new Collection&lt;IDataParameter&gt;();
          parameters.Clear();
          return parameters;
      }
  
  
  
      protected override MapperBase&lt;Restaurant&gt; GetMapper()
      {
          MapperBase&lt;Restaurant&gt; mapper = new RMapper();
          return mapper;
      }
  }
  </code></pre>
  
  <p>But whenever I tried to build , I am getting error 'T' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'T' in the generic type or method. Even T here is Restaurant has a Parameterless Public constructor.</p>