2016-10-13 1 views
2

J'utilise Bibliothèque FastMember pour convertir Liste des objets à un dataTable mais il retourne objet vide si quelqu'un pouvait me aider à résoudre ce problèmeFastMember ObjectReader Renvoie 0

List<object> list = new List<object>() { new { Number = 500 } }; 
DataTable table = new DataTable(); 
using (var reader = ObjectReader.Create(list)) 
{ 
    table.Load(reader); 
} 

Répondre

2

Apparemment, Fastmember n'est pas en mesure d'énumérer les propriétés hors des objets anonymes. Par conséquent, le lecteur de données créé n'a pas de colonnes et la méthode DataTable.Load refuse de créer des lignes vides pour ce lecteur.

Essayez avec une classe concrète si vous le pouvez:

class Thingy 
{ 
    public int Number { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<Thingy> list = new List<Thingy>() { new Thingy { Number = 500 } }; 
     DataTable table = new DataTable(); 
     using (var reader = ObjectReader.Create(list)) 
     { 
      table.Load(reader); 
     } 
    } 
} 

Edit: En fait, Fastmember est parfaitement capable d'accéder à ces propriétés, mais il empêche le type de la liste générique (objet) de voir leur. Il devrait également fonctionner si vous pouvez fournir un IEnumerable avec le type d'exécution réelle:

//This creates a "strongly" typed list, instead of List<object>: 
var list = new[] { (new { Number = 500 }) }.ToList(); 

DataTable table = new DataTable(); 
using (var reader = ObjectReader.Create(list)) 
{ 
    table.Load(reader); 
} 

Edit 2: Il y a une autre façon de passer en utilisant le constructeur les informations de type à Fastmember:

List<object> list = new List<object> { new { Number = 500 } }; 

DataTable table = new DataTable(); 

// Note that type information is derived directly from the first object in the list, 
// so try not to pass an empty one :) 
using (var reader = new ObjectReader(list[0].GetType(), list, null)) 
{ 
    table.Load(reader); 
} 

Notez également que cela est plus risqué que les autres approches car il est possible de créer une liste avec des types d'éléments mixtes. Fastmember a besoin que chaque élément de la liste soit exactement du même type et quelque chose comme le suivant entraînera une exception:

//These two items are not of the same type. Look carefully at the "Extra" property: 
List<object> list = new List<object> { new { Number = 500, Extra = true }, new { Number = 500, Extra = "Boom" } };