Дополнительно
Как создать новый экземпляр объекта типа
Никто не может всегда узнать тип объекта во время компиляции, но может нужно создать экземпляр тип
. Как вы получаете новый экземпляр объекта с "Тип"?
689
12
Класс
активатор
в пространстве имен корневой "системы" довольно мощный.Есть много перегрузок для передачи параметров конструктору и такие. Проверить документацию на:
или (Новый Путь)
Вот несколько простых примеров:
В
активатор
класса есть универсальный вариант, который делает это немного проще:Скомпилированное выражение является наилучшим образом! (для выполнения многократного создания экземпляра во время выполнения).
Статистика (2012):
Статистика (2015, .объем 4.5, х64):
Статистика (2015, .объем 4.5, х86):
Статистика (2017, помощью linqpad 5.22.02/х64/.Чистая 4.6):
Статистика (2019, х64/.Чистая 4.8):
Статистика (2019, х64/.Чистая ядро 3.0):
Полный код:
Одна из реализаций этой проблемы является попытка вызвать конструктор без параметров типа:
Здесь тот же подход, содержащийся в универсальный метод:
Его довольно просто. Предположим, что ваше имя-это "автомобиль" и пространство имен "транспортные средства", затем передать параметр как
средствами.Автомобиль
, который возвращает объект типа Car``. Как это можно создать динамически любой экземпляр любого класса.Если ваш полное имя(т. е. автомобилей.Автомобиль в данном случае) находится в другой сборке, не стоит.Метод gettype
будет null. В таких случаях вы должны перебрать все узлы и найти
тип`. Для этого вы можете использовать ниже кодИ вы можете получить экземпляр по телефонам указанным выше методом.
Если это то, что можно назвать много в экземпляре приложения, это's большое быстрее, чтобы скомпилировать и кэш динамический код вместо использования ConstructorInfo активатор или.Вызвать()
. Два простых вариантов для динамической компиляции [LINQ-выражений][1] или простой [
опкодов или
создает`]2. В любом случае, разница огромная, когда вы начнете получать в петле или несколько вызовов.Если вы хотите использовать конструктор по умолчанию, то решение с помощью системы.Активатор представили ранее, вероятно, наиболее удобный. Однако, если тип не имеет конструктора по умолчанию, или вы должны использовать по умолчанию один, то как вариант-использовать отражение или системы.ComponentModel.В разделе`. В случае рефлексии, достаточно знать только имя типа (с пространством имен).
Пример с помощью отражения:
Пример использования
в разделе
:Не'т универсальный
т т = т();
работать?Без использования отражения:
Учитывая эту проблему, активатор будет работать, когда есть конструктор без параметров. Если это ограничение рекомендуется использовать
Я могу на этот вопрос, потому что я искал, чтобы реализовать простой способ CloneObject для произвольного класса (конструктор по умолчанию)
С универсального метода вы можете требовать, что тип реализует новые().
С неуниверсальными предположить тип имеет конструктор по умолчанию и поймать исключение, если это не'т.