Как передать параметры в Activator.CreateInstance ‹T› ()

Я хочу создать экземпляр типа, который я указываю в имеющемся у меня универсальном методе. У этого типа есть несколько перегруженных конструкторов. Я хотел бы иметь возможность передавать аргументы конструкторам, но

Activator.CreateInstance<T>()

не видит в этом возможности.

Есть другой способ сделать это?


person DaveDev    schedule 16.03.2010    source источник


Ответы (5)


Да.

(T)Activator.CreateInstance(typeof(T), param1, param2);
person SLaks    schedule 16.03.2010

Есть еще один способ передать аргументы CreateInstance через именованные параметры.

Исходя из этого, вы можете передать массив в CreateInstance. Это позволит вам иметь 0 или несколько аргументов.

public T CreateInstance<T>(params object[] paramArray)
{
  return (T)Activator.CreateInstance(typeof(T), args:paramArray);
}
person sudhAnsu63    schedule 22.09.2016

Однако имейте в виду, что передача аргументов в Activator.CreateInstance имеет значительную разницу в производительности по сравнению с созданием без параметров.

Есть лучшие альтернативы для динамического создания объектов с использованием предварительно скомпилированной лямбды. Конечно, производительность всегда субъективна и явно зависит от каждого случая, стоит оно того или нет.

Подробнее о проблеме в этой статье.

График взят из статьи и представляет время в мс на 1000 звонков.

Сравнение производительности

person Anestis Kivranoglou    schedule 07.08.2018
comment
Для контекста эта диаграмма означает, что (в среднем на одном и том же оборудовании) каждый вызов параметризованного конструктора с Activator.CreateInstance будет занимать 0.0035ms (или 3,5 микросекунды) - в зависимости от вашего приложения это может даже не регистрироваться в тестах производительности. - person Dai; 19.05.2020

В качестве альтернативы Activator.CreateInstance FastObjectFactory в преформах связанного URL лучше, чем Activator (с .NET 4.0 и значительно лучше, чем .NET 3.5. Никаких тестов / статистики с .NET 4.5). См. Сообщение StackOverflow для получения статистики, информации и кода:

Как передать аргументы ctor в Activator.CreateInstance или использовать IL?

person thames    schedule 17.06.2010
comment
Вы имеете в виду, что существует альтернативное решение (связанное), которое, вероятно, будет работать лучше, чем Activator.CreateInstance, когда вы передаете параметры? Или это, вероятно, будет лучше во всех случаях? - person El Zorko; 21.01.2014
comment
Я давно не проводил тесты производительности, и похоже, что кто-то опубликовал статистику .NET 4.0, но да, с .NET 4.0 похоже, что FastObjectFactory имеет лучшую производительность. Activator.CreateInstance был ужасен в .NET 3.5 и был значительно быстрее в .NET 4.0, но все же медленнее, чем FastObjectFactory, связанный с этим URL-адресом. - person thames; 21.01.2014

person    schedule
comment
Это необъяснимый код. Сомневаюсь, что это помогает или вообще работает. Чтобы убедить меня в обратном, пожалуйста, объясните, как это работает и почему это должно решить проблему. - person Yunnosch; 03.04.2020