【问题标题】:How to Casting DataSource to List<T>?如何将 DataSource 转换为 List<T>?
【发布时间】:2012-12-26 03:24:51
【问题描述】:

我有以下在 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?

【问题讨论】:

  • 异常究竟说明了什么?

标签: c# winforms datagridview casting datasource


【解决方案1】:

您不能将协变直接转换为 List;

要么:

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

或:

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

【讨论】:

  • 对于行 List&lt;Object&gt; products = ((List&lt;Product&gt;)Source.DataSource).Cast&lt;object&gt;(); 不能将“System.COllections.Generic.IEnumerable”隐式键入到“System.COllections.Generic.List”。存在显式转换(您是否缺少演员表?)
  • 最后你需要一个 .ToList(),我的错!
【解决方案2】:

那么如何将 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,所以你需要先将它转换成那个。
  • 同样的问题。 AsEnumerableIEnumerable 的扩展方法,而不是object
  • 删除了最后一种方式。我想知道Cast&lt;&gt; 可以工作而AsEnumerable 不能工作,而两者都接受IEnumerable 作为输入?
  • 两者都行不通,这就是我要说的。你需要做((IEnumerable)Source.DataSource).Cast&lt;object&gt;()OfTypeDataSource 的类型是 object 而不是 IEnumerable&lt;object&gt;
【解决方案3】:

您的列表类型为List&lt;Product&gt;,与List&lt;object&gt; 不同。尝试投到List&lt;Product&gt;

【讨论】:

    【解决方案4】:

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

    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的入参类型到底是什么?你确定你需要一个 List
    • 这个想法是SaveAll&lt;T&gt;(List&lt;object&gt;) 是通用的,所以我将为所有持久对象调用这个方法。产品、供应商、制造商等
    • 那么如果签名是SaveAll&lt;T&gt;(List&lt;T&gt; ...,或者更好的是SaveAll&lt;T&gt;(IEnumerable&lt;T&gt; ...,会更有意义。
    猜你喜欢
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    相关资源
    最近更新 更多