Определение типа CollectionBase через Reflections (или Microsoft.Cci)

StackOverflow https://stackoverflow.com/questions/4846358

  •  27-10-2019
  •  | 
  •  

Вопрос

Вопрос :
Есть ли статический способ надежно определить тип, содержащийся в типе, производном от 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, реализуют Add (T)?Если это так, вы можете найти метод Add с одним параметром типа, отличного от object, и использовать этот тип для T.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top