Кастинг универсального набора к базовому типу

С технической точки зрения нет большой проблемы с огромным количеством двусторонних каналов. Процесс добавления новой организации будет означать, что вам нужно создать новый канал, присоединить пользовательский одноранговый узел к каналу, присоединить Org A к каналу, а затем создать какой-либо цепной код на этом канале. Довольно легко автоматизировать. В какой-то момент вам может потребоваться создать несколько пиров для организации A и распределить каналы по этим пирам.

С другой стороны, вы можете взглянуть на использование личных данных в сочетании с одобрением на уровне штата. Вместо того, чтобы создавать канал между Org A и каждым пользователем, вы можете вместо этого создать коллекцию Org A / Org N, а затем использовать одобрение на основе состояния, чтобы требовать одобрения только от Org A и Org N. Недостатком здесь является то, что Org N + 1 ... Org N + X получит хэши всех ключей / значений для всех пользователей ... которые вы, возможно, не захотите (тем более, что требуется, чтобы пользователи хранили данные, которые не относятся к ним).

6
задан dmo 11 February 2009 в 23:42
поделиться

5 ответов

Короткий ответ является "Нет". Необходимо было бы создать новый набор с новым Типом базового класса и заполнить его.

Если Вы думаете об этом, это имеет смысл. Если Вы могли бы просто "бросить" свой набор в BaseClass, Вы могли бы затем засунуть что-то, что имело тип "Базовый класс" в него, таким образом, вызывая простой объект BaseClass в Набор DerivedClass. Это победило бы цель, создающую Набор с Безопасностью с точки зрения типов.

В крайнем случае, если у Вас было два производных класса, Foo и Панель, Вы могли бы вызвать объекты Панели в набор объектов Foo путем преобразования типа набора назад к набору BaseClass.

8
ответ дан 8 December 2019 в 05:58
поделиться

Это называют ковариантностью и в то время как не в настоящее время поддерживаемый с дженериками в .NET, она будет добавлена в 4,0 платформах (наряду с противоположным, которое является контравариантностью).

Это превосходное видео с 2008 PDC является сессией на фьючерсах C#, данных Anders Hejlsberg:

http://channel9.msdn.com/pdc2008/TL16/

6
ответ дан 8 December 2019 в 05:58
поделиться

Переключение между универсальными контейнерами производных классов и базовых классов не поддерживается. (Это действительно работает с массивами), возможно записать, что конвертер типов к обоснованно чисто выполняет переключатель, вручную не копируя элементы между списками.

Проверьте эту ссылку для описания проблемы/ограничения и решения: http://www.25hoursaday.com/weblog/CommentView.aspx?guid=AF7AA888-A227-454C-8687-71FA77186064

Вниз внизу хорошая универсально-поддерживающая версия.

2
ответ дан 8 December 2019 в 05:58
поделиться

Я не думаю, что это возможно, и действительно это не должно быть:

class BaseClass {}
class DerivedClass : BaseClass {}
class OtherClass : BaseClass {}

void test()
{
  List<DerivedClass> list = new List<DerivedClass>();
  slice(list); //you want to do this
}

void slice(IList<BaseClass> list)
{
  //yikes! adding OtherClass to List<DerivedClass>
  list.Add(new OtherClass());
}
4
ответ дан 8 December 2019 в 05:58
поделиться

Если.NET 3.5 является опцией, можно использовать Cast<T> дополнительный метод в System.Core.dll получить только для чтения IEnumerable<T> для набора:

using System.Linq;
...
private void Refresh() {
  PopulateList( cachedCollection.Cast<cachedType>( ) );
}
2
ответ дан 8 December 2019 в 05:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: