如何将DataSource转换为List<T>?

19

我有以下方法,用于在DataGridView上加载产品

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

现在我正在尝试把自己交出来,以拯救他们,如下所示。

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;
}

但是在这行代码上我收到了一个 InvalidCastException.

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

那么我如何将DataSource转换为List?


异常信息具体是什么? - svick
4个回答

25

您无法直接将协变类型强制转换为List;

要么:

List<Product> products = (List<Product>)Source.DataSource;
或者:
List<Object> products = ((List<Product>)Source.DataSource).Cast<object>().ToList();

对于代码行 List<Object> products = ((List<Product>)Source.DataSource).Cast<object>();,无法隐式地将 'System.Collections.Generic.IEnumerable<object>' 类型转换为 'System.Collections.Generic.List<object>'。存在显式转换(是否缺少强制转换?) - Cristhian Boujon
你需要在结尾加上 .ToList(),我的错! - Dave Bish

6
所以我如何将DataSource转换为List?
你有很多选择。
var products = (List<Product>)Source.DataSource; // products if of type List<Product>

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

或者

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

或者

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

DataSource没有实现IEnumerable,所以你需要先将其转换为IEnumerable - Servy
同样的问题。AsEnumerableIEnumerable的扩展方法,而不是object - Servy
删除了最后一种方法。我在想为什么 Cast<> 可以工作而 AsEnumerable 不能,尽管两者都接受 IEnumerable 作为输入? - Tilak
都不行,这就是我说的。你需要使用((IEnumerable)Source.DataSource).Cast<object>()或者OfTypeDataSource的类型是object而不是IEnumerable<object> - Servy

3

您的列表是 List<Product> 类型,与 List<object> 不同。请尝试转换为 List<Product>


0

说服答案,这是我的解决方案:

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;
}

我接受建设性的批评。


SaveAll<Product>的输入参数类型到底是什么?你确定需要一个List<object>吗? - Eren Ersönmez
这个想法是 SaveAll<T>(List<object>) 是通用的,所以我将为所有持久化对象调用此方法。产品、供应商、制造商等。 - Cristhian Boujon
1
如果签名是 SaveAll<T>(List<T> ...,甚至更好的是 SaveAll<T>(IEnumerable<T> ...,那么这将更有意义。 - Eren Ersönmez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接