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

236

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

Activator.CreateInstance<T>()

не видит, чтобы иметь это в качестве опции.

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

DaveDev
источник

Ответы:

458

Да.

(T)Activator.CreateInstance(typeof(T), param1, param2);
SLaks
источник
2
Мне нравится этот ответ ;-)
frhack
16

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

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

public T CreateInstance<T>(params object[] paramArray)
{
  return (T)Activator.CreateInstance(typeof(T), args:paramArray);
}
sudhAnsu63
источник
2
Это кажется неполным, конечно, вам нужно вернуть объект типа T, а не void? public T CreateInstance <T> (params object [] paramArray) {return (T) Activator.CreateInstance (typeof (T), args: paramArray); }
WLF
11

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

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

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

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

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

Анестис Кивраноглу
источник
Для контекста эта диаграмма означает, что (в среднем на одном и том же оборудовании) каждый вызов параметризованного конструктора с использованием Activator.CreateInstanceзаймет 0.0035ms(или 3,5 микросекунды) - в зависимости от вашего приложения это может вообще не регистрироваться в тестах производительности.
Дай
6

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

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

Темза
источник
Вы имеете в виду, что существует альтернативное (связанное) решение, которое, вероятно, будет работать лучше, чем Activator.CreateInstance при передаче параметров? Или это может работать лучше во всех случаях?
Эль Зорко
1
Я не проводил тесты производительности некоторое время, и похоже, что кто-то опубликовал статистику .NET 4.0, но да, с .NET 4.0 похоже, что FastObjectFactory имеет лучшую производительность. Activator.CreateInstance был ужасен в .NET 3.5 и был значительно быстрее в .NET 4.0, но все же медленнее, чем FastObjectFactory, связанный с этим URL.
Темза
1
public class AssemblyLoader<T>  where T:class
{
    public void(){
        var res = Load(@"C:\test\paquete.uno.dos.test.dll", "paquete.uno.dos.clasetest.dll") 
    }

    public T Load(string assemblyFile, string objectToInstantiate) 
    {
        var loaded = Activator.CreateInstanceFrom(assemblyFile, objectToInstantiate).Unwrap();

        return loaded as T;
    }
}
Carga Dinamica de dll
источник
1
Это только необъяснимый код. Я сомневаюсь, что это помогает или даже работает вообще. Чтобы убедить меня, пожалуйста, объясните, как это работает и почему это должно решить проблему.
Юннош