Определение типа CollectionBase с помощью Reflections (или Microsoft.Cci)

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

Решение

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

Другие вопросы по тегам