2014-10-02 3 views
1

У меня есть класс коллекции, скажем UserCollection, который получен из Collection (базовый класс для общей коллекции).Получить коллекцию другого класса, используя общий класс 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

Что мне нужно для его работы?

+0

You необходимо снова зациклировать список и «Добавить» каждого пользователя один за другим в «UserCollection». –

+0

@Tim, поэтому из коллекции не дает никаких дополнительных преимуществ, кроме предоставления функций «Добавить/Удалить и т. Д.»? – Pankaj

+0

Почему вы создаете новый пользовательский класс вместо использования, скажем, 'List '? – Albireo

ответ

2

Вы могли бы обеспечить соответствующий конструктор, который вызывает базовый конструктор:

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<User> вместо потому List<User> не класс ребенок Collection<User> или UserCollection, но он реализует ICollection<User>.

Вот связанный с этим вопрос: Cannot implicitly convert List<T> to Collection<T>

0

Есть две причины, это не будет работать. В первую очередь вы не можете применять класс к унаследованному классу. UserCollection - это коллекция, но Collection не является UserCollection. Вы можете назначить UserCollection переменной Collection, но никак не наоборот. Кроме того, вы получаете список из метода ToCollection. Вы сталкиваетесь с тем же сценарием: Collection <> не является списком <>. См. 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); 
} 
+0

Дарн, я был избит до удара. – terryagi

Смежные вопросы