Come passare i parametri ad Activator.CreateInstance <T> ()


236

Voglio creare un'istanza di un tipo che ho specificato in un metodo generico che ho. Questo tipo ha un numero di costruttori sovraccarichi. Mi piacerebbe essere in grado di passare argomenti ai costruttori, ma

Activator.CreateInstance<T>()

non vede di avere questo come opzione.

C'è un altro modo per farlo?


Risposte:


458

Sì.

(T)Activator.CreateInstance(typeof(T), param1, param2);

2
Mi piace questa risposta ;-)
frhack

16

Esiste un altro modo per passare argomenti a CreateInstance tramite parametri denominati.

Sulla base di ciò, è possibile passare un array verso CreateInstance. Ciò ti consentirà di avere 0 o più argomenti.

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

2
Questo sembra incompleto, sicuramente devi restituire un oggetto di tipo T piuttosto che nullo? public T CreateInstance <T> (oggetto params [] paramArray) {return (T) Activator.CreateInstance (typeof (T), args: paramArray); }
wlf

11

Tieni presente, tuttavia, che passare argomenti su Activator.CreateInstance ha una differenza di prestazioni significativa rispetto alla creazione senza parametri.

Esistono alternative migliori per la creazione dinamica di oggetti mediante lambda precompilata. Ovviamente la performance è sempre soggettiva e dipende chiaramente da ogni caso se ne valga la pena o meno.

Dettagli sul problema in questo articolo.

Il grafico è tratto dall'articolo e rappresenta il tempo impiegato in ms per 1000 chiamate.

Confronto delle prestazioni


Per contesto, questo grafico significa che (in media, sullo stesso hardware) ogni chiamata di un costruttore con parametri Activator.CreateInstancerichiederà 0.0035ms(o 3,5 microsecondi) - a seconda dell'applicazione, potrebbe non essere nemmeno registrata nei test delle prestazioni.
Dai,

6

In alternativa ad Activator.CreateInstance, FastObjectFactory nell'URL collegato preforma meglio di Activator (a partire da .NET 4.0 e significativamente migliore di .NET 3.5. Nessun test / statistica fatto con .NET 4.5). Vedi il messaggio StackOverflow per statistiche, informazioni e codice:

Come passare ctor args in Activator.CreateInstance o usare IL?


Vuoi dire che esiste una soluzione alternativa (collegata) che probabilmente funzionerà meglio di Activator.CreateInstance quando si passano i parametri? O è probabile che funzioni meglio in tutti i casi?
El Zorko,

1
Non ho fatto test delle prestazioni per un po 'e sembra che qualcuno abbia pubblicato statistiche .NET 4.0, ma sì con .NET 4.0 sembra che FastObjectFactory abbia prestazioni migliori. Activator.CreateInstance era orribile in .NET 3.5 ed era significativamente più veloce in .NET 4.0, tuttavia ancora più lento di FastObjectFactory collegato in quell'URL.
Tamigi,

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
Questo è solo codice inspiegabile. Dubito che aiuti o addirittura funzioni affatto. Per convincermi altrimenti, per favore spiega come funziona e perché dovrebbe risolvere il problema.
Yunnosch,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.