Як передати параметри до Activator.CreateInstance <T> ()


236

Я хочу створити екземпляр типу, який я вказую в загальному методі, який у мене є. Цей тип має ряд перевантажених конструкторів. Мені б хотілося передати аргументи конструкторам, але

Activator.CreateInstance<T>()

не бачить, щоб це було як варіант.

Чи є інший спосіб це зробити?


Відповіді:



16

Існує ще один спосіб передачі аргументів CreateInstance через іменовані параметри.

Виходячи з цього, ви можете передати масив у бік CreateInstance. Це дозволить вам мати 0 або кілька аргументів.

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

2
Це здається неповним, напевно вам потрібно повернути об’єкт типу T, а не пустоту? 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, коли ви передаєте параметри? Або це, ймовірно, в усіх випадках краще?
El Zorko

1
Я не робив тести на ефективність протягом певного часу, і схоже, що хтось розмістив статистику .NET 4.0, але так. 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;
    }
}

1
Це лише пояснення коду. Я сумніваюся, що це допомагає або взагалі працює. Щоб переконати мене в іншому, поясніть, як це працює, і чому це повинно вирішити проблему.
Yunnosch
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.