Инстанцирование с помощью C # "динамического" ключевого слова - PullRequest
1 голос
/ 24 июля 2011

Я видел много примеров этого инструмента, который абстрагируется от громоздкого синтаксиса Reflection. Однако ни один из них не демонстрирует реализации неизвестного типа. Можно ли предположить, что это невозможно с «динамическим»?

Ответы [ 3 ]

4 голосов
/ 24 июля 2011

Логически, невозможно создать экземпляр неизвестного типа - для создания экземпляра типа что-то должно знать, что это такое.

dynamic полезно для манипулирование значениями неизвестного типа (предполагая, что оно способно к определенным операциям, которые потерпят неудачу во время выполнения, если они фактически невозможны).Для создания экземпляра любого типа, однако, вам либо нужно использовать создание во время компиляции (например, с помощью вызова конструктора C #), либо вам нужен экземпляр Type, который соответствует вашему желаемому типу.*

2 голосов
/ 25 июля 2011

Компилятор может использовать ключевое слово dynamic, чтобы dlr создавал тип, но он предназначен для позднего связывания аргументов конструктора, а не создаваемого типа.Фреймворк с открытым исходным кодом ImpromptuInterface абстрагирует вызовы dlr, включая конструктор .Если вам нужно вызвать конструктор с аргументами, он будет работать примерно в 5 раз быстрее, чем при использовании отражения / активатора.

var x = Impromptu.InvokeConstructor(Type.GetType("SomeType"),args...);
1 голос
/ 24 июля 2011

Я не знаю, какова ваша цель ... но вы подразумеваете что-то вроде

dynamic X = Type.GetType("SomeUnknownType").GetConstructor(null).Invoke(null);

?

, приведенное выше просто вызывает конструктор по умолчанию (без параметров) типа"SomeUnknownType" и присвойте полученный экземпляр dynamic.

...