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

Resuelto DaveDev asked hace 14 años • 5 respuestas

Quiero crear una instancia de un tipo que especifico 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 que esto sea una opción.

¿Hay otra manera de hacerlo?

DaveDev avatar Mar 16 '10 07:03 DaveDev
Aceptado

Sí.

(T)Activator.CreateInstance(typeof(T), param1, param2);
SLaks avatar Mar 16 '2010 00:03 SLaks

Hay otra forma de pasar argumentos a CreateInstance mediante parámetros con nombre.

En base a eso, puedes pasar una matriz hacia CreateInstance. Esto le permitirá tener 0 o varios argumentos.

public T CreateInstance<T>(params object[] paramArray)
{
  return (T)Activator.CreateInstance(typeof(T), args:paramArray);
}
sudhansu63 avatar Sep 22 '2016 04:09 sudhansu63

Editar: desde la publicación de esta respuesta, las cosas han cambiado en .NET 7. Consulte este artículo para obtener mejoras de rendimiento.

https://devblogs.microsoft.com/dotnet/performance_improvements_in_net_7/

Felicitaciones a @balrob por el aviso en los comentarios.

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.

Existen mejores alternativas para crear objetos dinámicamente utilizando lambda precompilado. Por supuesto siempre el rendimiento es subjetivo y claramente depende de cada caso si merece la pena o no.

Detalles sobre el problema en este artículo.

El gráfico está tomado del artículo y representa el tiempo necesario en ms por 1000 llamadas.

Comparación de rendimiento

Anestis Kivranoglou avatar Aug 07 '2018 08:08 Anestis Kivranoglou