Comment convertir une table de données en liste à l’aide de reflections

J’ai une liste générique d’une classe que je convertis automatiquement en DataTable à l’aide de Reflection et de méthodes d’extension. Maintenant, je veux le faire en sens inverse.Je veux convertir DataTable en List.Better pour dire que je veux de l’aide pour écrire une méthode attendez un DataTable et un Type et recherchez automatiquement la propriété de ce type (classe) en fonction du nom de la colonne et affectez une valeur à l’object de ce type (classe). comme ce code psodu:

 private List ConvertToList(DataTable dt) { List 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 } } } 

Comment puis-je faire ceci?


Éditer 1)

J’utilise la réponse de @Cuong Le comme ceci:

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

et :

 private List ConvertToList(DataTable dt,List fields) where T : class { return dt.AsEnumerable().Select(Convert(fields)).ToList(); <------ } private T Convert(DataRow row,List fields) where T : class { var properties = typeof(T).GetProperties().ToList(); var objT = Activator.CreateInstance(); foreach (var pro in properties) { pro.SetValue(objT, row[pro.Name],null); } return objT; } 

mais en ligne, je place une flèche devant elle et j’ai deux erreurs:

Pas de surcharge pour la méthode ‘Convert’ prend 1 argument

et

Les arguments de type de la méthode ‘System.Data.EnumerableRowCollectionExtensions.Select (System.Data.EnumerableRowCollection, System.Func)’ ne peuvent pas être déduits de l’utilisation. Essayez de spécifier explicitement les arguments de type.

Comment je peux résoudre ce problème?

Utilisez la méthode AsEnumerable() pour prendre en charge LINQ:

  private List ConvertToList(DataTable dt) { var columnNames = dt.Columns.Cast() .Select(c => c.ColumnName) .ToList(); var properties = typeof(T).GetProperties(); return dt.AsEnumerable().Select(row => { var objT = Activator.CreateInstance(); foreach (var pro in properties) { if (columnNames.Contains(pro.Name)) pro.SetValue(objT, row[pro.Name]); } return objT; }).ToList(); } 

GetProperties recherche les propriétés du type actuel à l’aide des contraintes de liaison spécifiées.

Le lien ici: http://msdn.microsoft.com/en-us/library/kyaxdd3x.aspx