С технической точки зрения нет большой проблемы с огромным количеством двусторонних каналов. Процесс добавления новой организации будет означать, что вам нужно создать новый канал, присоединить пользовательский одноранговый узел к каналу, присоединить Org A к каналу, а затем создать какой-либо цепной код на этом канале. Довольно легко автоматизировать. В какой-то момент вам может потребоваться создать несколько пиров для организации A и распределить каналы по этим пирам.
С другой стороны, вы можете взглянуть на использование личных данных в сочетании с одобрением на уровне штата. Вместо того, чтобы создавать канал между Org A и каждым пользователем, вы можете вместо этого создать коллекцию Org A / Org N, а затем использовать одобрение на основе состояния, чтобы требовать одобрения только от Org A и Org N. Недостатком здесь является то, что Org N + 1 ... Org N + X получит хэши всех ключей / значений для всех пользователей ... которые вы, возможно, не захотите (тем более, что требуется, чтобы пользователи хранили данные, которые не относятся к ним).
Короткий ответ является "Нет". Необходимо было бы создать новый набор с новым Типом базового класса и заполнить его.
Если Вы думаете об этом, это имеет смысл. Если Вы могли бы просто "бросить" свой набор в BaseClass, Вы могли бы затем засунуть что-то, что имело тип "Базовый класс" в него, таким образом, вызывая простой объект BaseClass в Набор DerivedClass. Это победило бы цель, создающую Набор с Безопасностью с точки зрения типов.
В крайнем случае, если у Вас было два производных класса, Foo и Панель, Вы могли бы вызвать объекты Панели в набор объектов Foo путем преобразования типа набора назад к набору BaseClass.
Это называют ковариантностью и в то время как не в настоящее время поддерживаемый с дженериками в .NET, она будет добавлена в 4,0 платформах (наряду с противоположным, которое является контравариантностью).
Это превосходное видео с 2008 PDC является сессией на фьючерсах C#, данных Anders Hejlsberg:
Переключение между универсальными контейнерами производных классов и базовых классов не поддерживается. (Это действительно работает с массивами), возможно записать, что конвертер типов к обоснованно чисто выполняет переключатель, вручную не копируя элементы между списками.
Проверьте эту ссылку для описания проблемы/ограничения и решения: http://www.25hoursaday.com/weblog/CommentView.aspx?guid=AF7AA888-A227-454C-8687-71FA77186064
Вниз внизу хорошая универсально-поддерживающая версия.
Я не думаю, что это возможно, и действительно это не должно быть:
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());
}
Если.NET 3.5 является опцией, можно использовать Cast<T>
дополнительный метод в System.Core.dll
получить только для чтения IEnumerable<T>
для набора:
using System.Linq;
...
private void Refresh() {
PopulateList( cachedCollection.Cast<cachedType>( ) );
}