Вопрос :
Существует ли статический способ надежного определения типа, содержащегося в типе, производном от CollectionBase
, с использованием Reflection или Microsoft.Cci?
Фон :
Я работаю над генератором кода, который копирует типы, создает индивидуальные версии этих типов и конвертеры между ними.Он проходит типы в исходной сборке через Microsoft.Cci.Он печатает исходный код с использованием текстовых шаблонов.Он выполняет много преобразований и настроек и отбрасывает код, который меня не волнует.
В моем результирующем коде я намерен заменить List<T>
везде, где CollectionBase
, IEnumerable<T>
,или T[]
ранее использовался.Я хочу использовать List<T>
, потому что я уверен, что могу сериализовать его без дополнительной работы, что важно для моего приложения.T
конкретен в каждом случае.Я пытаюсь не копировать CollectionBase
классы, потому что мне нужно скопировать пользовательскую реализацию, и я бы хотел избежать этого в моем генераторе кода.
Единственная часть, которую явозникла проблема с определением T
для List<T>
при замене пользовательского CollectionBase
.
Что я сделал до сих пор :
Я кратко рассмотрелДокументы и примеры MSDN для CollectionBase
, в которых упоминается создание пользовательского метода Add
для вашего производного типа.Я не думаю, что это каким-либо образом обеспечивается, поэтому я не уверен, что могу на это положиться.Разработчик может назвать это как-то еще, или, что еще хуже, иметь коллекцию, которая поддерживает несколько типов, с Object
в качестве единственного общего предка.
Альтернативы, которые я рассмотрел :
Может бытьсериализация по умолчанию делает некоторые трюки, которыми я могу воспользоваться.Существует ли сериализация по умолчанию для коллекций CollectionBase
, или вам, как правило, приходится реализовывать ее самостоятельно?Если вам нужно сделать это самостоятельно, есть ли надежные метаданные, на которые я мог бы обратить внимание, чтобы определить типы?Если он поддерживает сериализацию по умолчанию, полагается ли он на типы времени выполнения элементов в коллекции?
Я мог бы сделать отображение в моем генераторе кода известных CollectionBase
типов, сопоставленных с их соответствующими T
дляList<T>
.Если данного типа CollectionBase
, с которым я сталкиваюсь, нет в списке, выведите исключение.Это, вероятно, то, что я пойду, если у меня нет надежной альтернативы.