2010-03-16 27 views
161

Quiero crear una instancia de un tipo que especifique en un método genérico que tengo. Este tipo tiene una cantidad de constructores sobrecargados. Me gustaría ser capaz de pasar argumentos a los constructores, peroCómo pasar parámetros a Activator.CreateInstance <T>()

Activator.CreateInstance<T>() 

no ve tener esto como una opción.

¿Hay alguna otra manera de hacerlo?

+3

posible duplicado de [Activator.CreateInstance - Cómo crear instancias de clases que tienen los constructores parametrizados] (http://stackoverflow.com/questions/1288310/activator-createinstance-how-to-create-instances- of-classes-that-have-paramete) – nawfal

Respuesta

306

Yes.

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

Como alternativa a Activator.CreateInstance, FastObjectFactory en las preformas URL enlazado mejor que el activador (a partir de .NET 4.0 y significativamente mejor que .NET 3.5. No hay pruebas/estadísticas hechas con. NET 4.5). Ver post StackOverflow para las estadísticas, información y código:

How to pass ctor args in Activator.CreateInstance or use IL?

+0

¿Quiere decir que hay una solución alternativa (vinculada) que probablemente tenga un mejor rendimiento que Activator.CreateInstance cuando pasa parámetros? ¿O es probable que funcione mejor en todos los casos? –

+1

No he hecho pruebas de rendimiento por un tiempo y parece que alguien publicó estadísticas .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

8

Hay otra manera de pasar argumentos a través de createInstance parámetros con nombre.

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

public void CreateInstance<T>(params object[] paramArray) 
{ 
    (T)Activator.CreateInstance(typeof(T), args:paramArray); 
} 
+2

Esto parece incompleto, seguramente necesita devolver un objeto de tipo T en lugar de anularlo. public T CreateInstance (objeto params [] paramArray) { return (T) Activator.CreateInstance (typeof (T), args: paramArray); } – wlf

Cuestiones relacionadas