Определение типа 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.