Я хочу создать экземпляр типа, который я указываю в общем методе, который у меня есть. Этот тип имеет несколько перегруженных конструкторов. Я хотел бы иметь возможность передавать аргументы конструкторам, но
Activator.CreateInstance<T>()
не видит, чтобы иметь это в качестве опции.
Есть ли другой способ сделать это?
c#
generics
createinstance
DaveDev
источник
источник
Ответы:
Да.
источник
Есть еще один способ передать аргументы в CreateInstance через именованные параметры.
Исходя из этого, вы можете передать массив в сторону
CreateInstance
. Это позволит вам иметь 0 или несколько аргументов.источник
Имейте в виду, что передача аргументов в Activator.CreateInstance имеет существенную разницу в производительности по сравнению с созданием без параметров.
Существуют лучшие альтернативы для динамического создания объектов с использованием предварительно скомпилированной лямбды. Конечно, производительность всегда субъективна, и она зависит от каждого конкретного случая, стоит оно того или нет.
Подробности о проблеме в этой статье.
График взят из статьи и представляет время в мс на 1000 вызовов.
источник
Activator.CreateInstance
займет0.0035ms
(или 3,5 микросекунды) - в зависимости от вашего приложения это может вообще не регистрироваться в тестах производительности.В качестве альтернативы Activator.CreateInstance FastObjectFactory в связанном URL-адресе преформируется лучше, чем Activator (начиная с .NET 4.0 и значительно лучше, чем .NET 3.5. Никаких тестов / статистики, выполненных с .NET 4.5). Смотрите сообщение StackOverflow для получения статистики, информации и кода:
Как передать аргументы ctor в Activator.CreateInstance или использовать IL?
источник
источник