2010-07-15 12 views
69

tengo el siguiente escenario:Utilizando C# reflexión para llamar a un constructor

class Addition{ 
public Addition(int a){ a=5; } 
public static int add(int a,int b) {return a+b; } 
} 

Estoy llamando a añadir en otra clase por:

string s="add"; 
typeof(Addition).GetMethod(s).Invoke(null, new object[] {10,12}) //this returns 22 

Necesito una manera similar a la declaración de la reflexión anterior a crear un nuevo objeto de tipo Adición usando Addition(int a)

Así que tengo la cadena s= "Addition", quiero crear un nuevo objeto utilizando la reflexión.

¿Esto es posible?

+3

¿Por qué quieres usar la reflexión? La reflexión viene con una penalización de rendimiento, crea problemas de mantenimiento a largo plazo ... –

+20

@Patrick, hay muchos casos en que la penalización de rendimiento puede ignorarse siempre que se logre el objetivo del usuario. – Kiril

Respuesta

125

No creo GetMethod lo hará, no - pero GetConstructor voluntad.

using System; 
using System.Reflection; 

class Addition 
{ 
    public Addition(int a) 
    { 
     Console.WriteLine("Constructor called, a={0}", a); 
    } 
} 

class Test 
{ 
    static void Main() 
    { 
     Type type = typeof(Addition); 
     ConstructorInfo ctor = type.GetConstructor(new[] { typeof(int) }); 
     object instance = ctor.Invoke(new object[] { 10 }); 
    } 
} 

EDIT: Sí, Activator.CreateInstance también funcionará. Use GetConstructor si quiere tener más control sobre las cosas, descubra los nombres de los parámetros, etc. Activator.CreateInstance es genial si solo quiere llamar al constructor.

+1

Sí, pero luego debe implementar todas las reglas de resolución de sobrecarga para elegir el constructor correcto. Mientras que el tiempo de ejecución lo hará por usted si llama a http://msdn.microsoft.com/en-us/library/wcxyzt4d.aspx –

+3

Por lo tanto, se prefiere 'GetConstructor' si desea almacenar en caché un delegado (mejora del rendimiento al llamar al mismo constructor muchas veces), pero para uso único, 'Activator' sería más fácil. –

+0

@Ben: Definitivamente depende de sus requisitos, sí. –

Cuestiones relacionadas