Cómo pasar parámetros a Activator.CreateInstance <T> ()

Respuestas:

458

Si.

(T)Activator.CreateInstance(typeof(T), param1, param2);
SLaks
fuente
2
Me gusta esta respuesta ;-)
frhack
16

Hay otra forma de pasar argumentos a CreateInstance a través de parámetros con nombre.

En base a eso, puede pasar una matriz hacia CreateInstance. Esto le permitirá tener 0 o múltiples argumentos.

public T CreateInstance<T>(params object[] paramArray)
{
  return (T)Activator.CreateInstance(typeof(T), args:paramArray);
}
sudhAnsu63
fuente
2
Esto parece incompleto, ¿seguramente necesita devolver un objeto de tipo T en lugar de vacío? public T CreateInstance <T> (params object [] paramArray) {return (T) Activator.CreateInstance (typeof (T), args: paramArray); }
wlf
11

Sin embargo, tenga en cuenta que pasar argumentos en Activator.CreateInstance tiene una diferencia de rendimiento significativa en comparación con la creación sin parámetros.

Hay mejores alternativas para crear objetos dinámicamente usando lambda precompilada. Por supuesto, el rendimiento siempre es subjetivo y depende claramente de cada caso si vale la pena o no.

Detalles sobre el problema en este artículo.

El gráfico se toma del artículo y representa el tiempo que se tarda en ms por cada 1000 llamadas.

Comparación de rendimiento

Anestis Kivranoglou
fuente
Para el contexto, este gráfico significa que (en promedio, en el mismo hardware) cada invocación de un constructor parametrizado Activator.CreateInstancetomará 0.0035ms(o 3,5 microsegundos); dependiendo de su aplicación, esto puede no registrarse en las pruebas de rendimiento.
Dai
6

Como alternativa a Activator.CreateInstance, FastObjectFactory en la url vinculada tiene mejores formas que Activator (a partir de .NET 4.0 y significativamente mejor que .NET 3.5. No se realizaron pruebas / estadísticas con .NET 4.5). Vea la publicación de StackOverflow para estadísticas, información y código:

¿Cómo pasar args ctor en Activator.CreateInstance o usar IL?

thames
fuente
¿Quiere decir que hay una solución alternativa (vinculada) que es probable que funcione mejor que Activator.CreateInstance cuando pasa parámetros? ¿O es probable que funcione mejor en todos los casos?
El Zorko
1
No he hecho pruebas de rendimiento en mucho tiempo y parece que alguien publicó estadísticas de .NET 4.0, pero sí, con .NET 4.0 parece que FastObjectFactory tiene un mejor rendimiento. Activator.CreateInstance fue horrible en .NET 3.5 y fue significativamente más rápido en .NET 4.0, pero aún más lento que FastObjectFactory vinculado en esa url.
thames
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
fuente
1
Esto es solo de código inexplicable. Dudo que ayude o incluso funcione en absoluto. Para convencerme de lo contrario, explique cómo funciona esto y por qué se supone que resuelve el problema.
Yunnosch