【问题标题】:Get Collection of Other Class using generic Collection class使用通用集合类获取其他类的集合
【发布时间】:2014-11-27 12:38:08
【问题描述】:

我有一个集合类,比如说UserCollection,它派生自Collection(通用集合的基类)。

现在我想要一个UserCollection,这是我的代码,但它不能从通用List 转换为我的集合类:

public class User
{
  // All user Fields
}

public class UserCollection : Collection<User>
{
   public static UserCollection GetUserCollection()
   {
       DataTable table = ...//all users data from DB
       List<User> userList = table.ToCollection<User>(); // Call an extension method to convert to          generic List of user
       return userList; // Cannot implicitly convert type 'System.Collections.Generic.List<User>' to 'UserCollection'
   }
}

// ToCollection 函数在这里

http://www.codeproject.com/Tips/195889/Convert-Datatable-to-Collection-using-Generic

我需要什么才能让它工作?

【问题讨论】:

  • 您必须再次循环列表并将Add 每个用户一个接一个地循环到UserCollection
  • @Tim,所以从 Collection 派生并没有给我任何额外的好处,除了提供添加/删除等功能?
  • 你为什么要创建一个新的自定义类而不是使用List&lt;T&gt;

标签: c# generics collections


【解决方案1】:

您可以提供一个适当的构造函数来调用基本构造函数:

public class UserCollection : Collection<User>
{
    public UserCollection() { }
    public UserCollection(IList<User> users) : base(users) { }

    public static UserCollection GetUserCollection()
    {
        // ...
        List<User> userList = ... 
        return new UserCollection(userList);
    }
}

或者您必须返回 ICollection&lt;User&gt;,因为 List&lt;User&gt; 不是 Collection&lt;User&gt;UserCollection 的子类,但它实现了 ICollection&lt;User&gt;

这是一个相关的问题:Cannot implicitly convert List<T> to Collection<T>

【讨论】:

    【解决方案2】:

    这不起作用有两个原因。首先,您不能将类强制转换为继承的类。 UserCollection 是一个集合,但 Collection 不是一个 UserCollection。您可以将 UserCollection 分配给 Collection 变量,但不能反过来。此外,您从 ToCollection 方法接收一个列表。您会遇到相同的情况:Collection 不是 List。有关投射的更多信息,请参阅http://msdn.microsoft.com/en-us/library/ms173105.aspx

    一种解决方案是实现一个构造函数,该构造函数调用采用 IList 的基本构造函数,如下所示:

    public UserCollection(IList<User> users)
        : base(users)
    {
    }
    

    然后你可以修改你的 GetUserCollection 方法来调用它:

    public static UserCollection GetUserCollection()
    {
       DataTable table = ...//all users data from DB
       List<User> userList = table.ToCollection<User>(); 
       return new UserCollection(userList);
    }
    

    【讨论】:

    • 该死,我被打败了。
    猜你喜欢
    • 2016-11-03
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    相关资源
    最近更新 更多