Определение типа CollectionBase через Reflections (или Microsoft.Cci) - PullRequest
1 голос
/ 31 января 2011

Вопрос :
Существует ли статический способ надежного определения типа, содержащегося в типе, производном от 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, с которым я сталкиваюсь, нет в списке, выведите исключение.Это, вероятно, то, что я пойду, если у меня нет надежной альтернативы.

1 Ответ

0 голосов
/ 14 февраля 2011

Я все еще недостаточно уверен в том, что вы хотите сделать, чтобы дать совет. Все же, все ваши классы, производные от CollectionBase, реализуют Add (T)? Если это так, вы можете найти метод Add с одним параметром типа, отличного от object, и использовать этот тип для T.

...