Создание динамических обобщений во время выполнения с помощью Reflection - PullRequest
6 голосов
/ 27 февраля 2011

Я пытаюсь преобразовать словарь <<strong> динамический , динамический > в статически типизированный путем изучения типов ключей и значений и создание нового словаря соответствующих типов с использованием Reflection. Если я знаю тип ключа и значения, я могу сделать следующее:

Type dictType = typeof(Dictionary<,>);

        newDict = Activator.CreateInstance(dictType.MakeGenericType(new Type[] { keyType, valueType }));

Однако мне может понадобиться, например, создать Словарь <<strong> MyKeyType , dynamic >, если значения не все одного типа, и я не могу понять, как указать динамический тип, поскольку

typeof(dynamic)

нежизнеспособен.

Как мне поступить, и / или есть ли более простой способ выполнить то, что я пытаюсь сделать?

Ответы [ 2 ]

4 голосов
/ 27 февраля 2011

Компилятор C # испускает System.Object как тип для «динамического». «динамический» является языковой конструкцией и не имеет соответствующего типа в общей языковой инфраструктуре. Таким образом, вы не сможете использовать отражение для создания «динамического» или использовать «динамический» в качестве параметра универсального типа.

Словарь <динамический, динамический> - это действительно словарь <объект, объект>. То, что «динамически» означает для компилятора, это просто поздняя привязка любого доступа к элементу для объекта с помощью отражения (реализация которого лежит на сборке Microsoft.CSharp, если вам интересно).

В дополнение к этому, компилятор также выдаст атрибут DynamicAttribute для полей, параметров и т. Д., Которые являются "динамическими"; это позволяет людям, использующим метаданные сборки, различать System.Object и «динамический». Вот как IntelliSense показывает параметр метода как динамический из ссылки на сборку, например.

2 голосов
/ 27 февраля 2011
Dictionary<MyType, Object>

Activator.CreateInstance(typeof (Dictionary<dynamic, dynamic>));

Это фактически создает Dictionary<Object, Object>

Единственное использование, которое я вижу при использовании динамического вместо объекта, - во время набора кода вы можете использовать dic ["some"]. MyDynProperty ....но если вы создадите свой объект с помощью Activator, он вернет Object, поэтому бесполезно печатать код ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...