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


236

Quiero crear una instancia de un tipo que especifique en un método genérico que tengo. Este tipo tiene varios constructores sobrecargados. Me gustaría poder pasar argumentos a los constructores, pero

Activator.CreateInstance<T>()

no ve tener esto como una opción.

¿Hay otra forma de hacerlo?


Respuestas:


458

Si.

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

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);
}

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


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?


¿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;
    }
}

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.