Como converter DataTable para List <T> usando reflexões
Eu tenho uma lista genérica de uma classe que eu convertê-lo automaticamente para DataTable usandoReflection
e métodos de extensão.Agora eu quero fazer isso em sentido inverso.Quero converterDataTable
para List.Better para dizer que eu quero ajuda para escrever um método que espera umDataTable
e umType
e automaticamente encontrar a propriedade desse tipo (classe) de acordo com o nome da coluna e atribuir o valor ao objeto desse Tipo (classe) .como este código 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 posso fazer isso?
Editar 1)
Eu uso a resposta do @Cuong Le assim:
var properties = typeof(CustomType).GetProperties().ToList();
List<CustomType> list = ConvertToList<CustomType>(dt, properties);
e:
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;
}
mas na linha eu coloco uma flecha na frente dele eu tenho esses dois erros:
Nenhuma sobrecarga para o método 'Convert' recebe 1 argumentos
e
Os argumentos de tipo para o método 'System.Data.EnumerableRowCollectionExtensions.Select (System.Data.EnumerableRowCollection, System.Func)' não podem ser inferidos a partir do uso. Tente especificar os argumentos de tipo explicitamente.
Como posso resolver este problema?