Cómo pasar parámetros a Activator.CreateInstance<T>()
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?
Sí.
(T)Activator.CreateInstance(typeof(T), param1, param2);
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);
}
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.