C #: Общие члены в неуниверсальных типах? - PullRequest
4 голосов
/ 19 октября 2010

У меня есть пользовательский элемент управления, который содержит список объектов. Элемент управления создается визуальным дизайнером, а затем настраивается в коде. Элемент управления представляет собой сетку, которая отображает список объектов.

У меня есть такой метод инициализации.

public void Initialise(ISession session, Type type, ICollection<IPersistentObject> objs)

IPersistentObject - это интерфейс. Однако это не работает, когда я хочу назначить коллекцию чего-то, что реализует IPersistentObject.

Так что я изменил это на

public void Initialise<T>(ISession session, Type type, ICollection<T> objs) where T : class, IPersistentObject

Но теперь я хочу присвоить параметр objs переменной-члену типа ICollection<IPersistentObject>, которая не работает.

Я не могу сделать класс универсальным, потому что это элемент управления, который не может иметь универсальные типы AFAIK. Я не могу скопировать коллекцию, потому что элемент управления ДОЛЖЕН изменить переданную коллекцию, а не взять копию и изменить ее.

Что мне делать?

Ответы [ 3 ]

3 голосов
/ 19 октября 2010

Если вам не нужно, чтобы объекты были фактической коллекцией (например, с Add / Remove методами и т. Д.), Тогда вы можете заменить ICollection на IEnumerable.

void Initialise(ISession session, Type type, IEnumerable<IPersistentObject> objs)
2 голосов
/ 19 октября 2010

ICollection<T> не поддерживает общую дисперсию, подобную этой. На мой взгляд, ваши варианты:

  1. Кодируйте обертку вокруг ICollection<T>, которая оборачивает ICollection<IPersistentObject> и выполняет проверку типа для вас.
  2. Вместо этого используйте IEnumerable<T>, который поддерживает дисперсию описанным вами способом.
  3. Используйте неуниверсальный IList, если ваши конкретные классы реализуют его.
0 голосов
/ 19 октября 2010

Вы можете изменить переменную-член на неуниверсальную ICollection и при необходимости привести ее.

...