Como pasar los Parámetros al Activador.CreateInstance ()


Quiero crear una instancia de un tipo que especifique en un método genérico que tengo. Este tipo tiene un número de 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 manera de hacerlo?

Author: p.campbell, 2010-03-16

4 answers

Sí.

(T)Activator.CreateInstance(typeof(T), param1, param2);
 350
Author: SLaks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-16 00:08:48

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

Basado en eso, puede 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);
}
 11
Author: sudhAnsu63,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-23 19:08:12

Como alternativa al Activador.CreateInstance, FastObjectFactory en la url vinculada se preforma mejor que Activator (a partir de.NET 4.0 y significativamente mejor que. NET 3.5. No hay pruebas / estadísticas hechas con. NET 4.5). Ver StackOverflow post para estadísticas, información y código:

Cómo pasar ctor args en Activador.¿Cree una instancia o use IL?

 6
Author: thames,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:38

Tenga en cuenta sin embargo que pasando argumentos en Activador.CreateInstance tiene una diferencia de rendimiento significativa frente a la creación sin parámetros.

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

Detalles sobre el tema en este artículo.

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

Comparación de rendimiento

 1
Author: Anestis Kivranoglou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-07 08:32:06