Cómo convertir DataTable a la lista <T> usando reflexiones

Tengo una lista genérica de una clase que la convierto automáticamente a DataTable usandoReflection y métodos de extensión. Ahora quiero hacerlo en dirección inversa. Quiero convertirDataTable a List.Better to say Quiero ayuda para escribir un método que espera unDataTable y unType y encuentre automáticamente la propiedad de ese tipo (clase) de acuerdo con el nombre de la columna y asigne un valor al objeto de ese tipo (clase). como este código de psodu:

private List<T> ConvertToList<T>(DataTable dt)
{
    List<string> AllColumns = // Get All Column Names of a DataTable
    for(int i=0;i<dt.Rows.Count;i++)
    {
        foreach(var item in AllColumns )
        {
             //Get Property According To **ITEM**
             //Get Data Of Rows[i][item] and assign it to T.property
        }
    }
}

¿Como puedo hacer esto?

Editar 1)

Yo uso la respuesta de @Cuong Le de esta manera:

var properties = typeof(CustomType).GetProperties().ToList();
List<CustomType> list = ConvertToList<CustomType>(dt, properties);

y:

private List<T> ConvertToList<T>(DataTable dt,List<PropertyInfo> fields) where T : class
{
    return dt.AsEnumerable().Select(Convert<T>(fields)).ToList();  <------
}

private T Convert<T>(DataRow row,List<PropertyInfo> fields) where T : class
{
    var properties = typeof(T).GetProperties().ToList();

    var objT = Activator.CreateInstance<T>();
    foreach (var pro in properties)
    {
        pro.SetValue(objT, row[pro.Name],null);
    }

    return objT;
} 

pero en la línea coloco una flecha enfrente de esta obtuve estos dos errores:

Sin sobrecarga para el método 'Convertir' toma 1 argumentos

y

Los argumentos de tipo para el método 'System.Data.EnumerableRowCollectionExtensions.Select (System.Data.EnumerableRowCollection, System.Func)' no pueden deducirse del uso. Intenta especificar los argumentos de tipo explícitamente.

¿Cómo puedo resolver este problema?

Respuestas a la pregunta(1)

Su respuesta a la pregunta