Проблема, которую вы описываете, является фундаментальным принципом дженериков.
ICollection<Object>
не является базовым классом ICollection<String>
, даже если String
является дочерним классом Object
. Это делается во время компиляции, поэтому вы в основном получаете два разных определения класса ICollection. Поэтому их нельзя кастовать. (Умные люди ТАК, пожалуйста, не стесняйтесь исправлять меня в случае любых неточностей)
В MVC3 я работал над этим, выполняя следующие действия:
class Container{
/* Stuff here */
}
class Container<T> : Container{
T Data {get;set;}
}
Тогда, по вашему мнению,
@model Container
Когда вам нужны только общие вещи, не зная общего типа.
@model Container<SomeDataType>
Когда вам нужны данные общего типа.
Вариант использования:
Я создаю класс ModelContainer, в котором хранится моя модель вместе с массивом сообщений об ошибках, которые могут отображаться на странице частично. Поскольку частичное можно использовать на каждой странице, он не знает, какой будет тип Generic, поэтому этот обходной путь необходим.
Это нельзя использовать, если вы пытаетесь получить доступ к общим данным, не зная их типа. Надеюсь, это решит вашу проблему.