web-dev-qa-db-fra.com

Comment convertir une source de données dans la liste <T>?

J'ai la méthode suivante qui charge des produits sur un DataGridView

private void LoadProducts(List<Product> products)
{
    Source.DataSource = products;  // Source is BindingSource
    ProductsDataGrid.DataSource = Source;
}

Et maintenant, j'essaie de me rendre pour les sauvegarder comme indiqué ci-dessous.

private void SaveAll()
{
   Repository repository = Repository.Instance;
   List<object> products = (List<object>)Source.DataSource; 
   Console.WriteLine("Este es el número {0}", products.Count);
   repository.SaveAll<Product>(products);
   notificacionLbl.Visible = false;
}

Mais je reçois une InvalidCastException sur cette ligne:

List<object> products = (List<object>)Source.DataSource;

Alors, comment puis-je convertir le DataSource dans une liste?

13
Cristhian Boujon

Vous ne pouvez pas lancer de covariance directement dans List;

Non plus:

List<Product> products = (List<Product>)Source.DataSource;

ou:

List<Object> products = ((List<Product>)Source.DataSource).Cast<object>().ToList();
20
Dave Bish

Alors, comment puis-je convertir le DataSource dans une liste?

Vous avez beaucoup d'options

var products = (List<Product>)Source.DataSource; // products if of type List<Product>

ou 

 List<Object> products = ((IEnumerable)Source.DataSource).Cast<object>().ToList();

ou

List<Object>  products = ((IEnumerable)Source.DataSource).OfType<object>().ToList();

ou

List<Object> products = new List<Object>();
((IEnumerable)Source.DataSource).AsEnumerable().ToList().ForEach( x => products.Add( (object)x));
4
Tilak

Votre liste est de type List<Product>, ce qui diffère de List<object>. Essayez de transtyper en List<Product>

3
CubeSchrauber

Convaincre les réponses Voici ma solution:

private void SaveAll()
{
    Repository repository = Repository.Instance;
    List<Product> products = (List<Product>)Source.DataSource;
    IEnumerable<object> objects = products.Cast<object>();
    repository.SaveAll<Product>(objects.ToList<object>());
    notificacionLbl.Visible = false;
}

J'accepte les critiques constructives.

0
Cristhian Boujon