Jak przekonwertować DataTable na List <T> używając Reflections
Mam listę rodzajową klasy, którą automatycznie konwertuję na DataTable za pomocąReflection
i metody rozszerzenia. Teraz chcę to zrobić w odwrotnym kierunku. Chcę się przekonwertowaćDataTable
do List.Better powiedzieć, że chcę pomóc napisać metodę, która oczekujeDataTable
i aType
i automatycznie znajdź właściwość tego typu (klasy) zgodnie z nazwą kolumny i przypisz wartość do obiektu tego typu (klasy). podobnie jak ten kod 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
}
}
}
Jak mogę to zrobić?
Edytuj 1)
Używam odpowiedzi @Cuong Le w następujący sposób:
var properties = typeof(CustomType).GetProperties().ToList();
List<CustomType> list = ConvertToList<CustomType>(dt, properties);
i :
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;
}
ale w linii umieściłem strzałkę przed nim, dostałem dwa błędy:
Brak przeciążenia dla metody „Konwertuj” przyjmuje 1 argumenty
i
Argumenty typu dla metody 'System.Data.EnumerableRowCollectionExtensions.Select (System.Data.EnumerableRowCollection, System.Func)' nie można wywnioskować z użycia. Spróbuj wyraźnie podać argumenty typu.
Jak mogę rozwiązać ten problem?