2008-10-21 17 views
55

¿Hay alguna manera de invocar un método sobrecargado usando reflection en .NET (2.0)? Tengo una aplicación que crea instancias dinámicas de clases que se han derivado de una clase base común. Para fines de compatibilidad, esta clase base contiene 2 métodos del mismo nombre, uno con parámetros y otro sin. Necesito llamar al método sin parámetros a través del método Invoke. En este momento, todo lo que obtengo es un error diciéndome que estoy tratando de llamar a un método ambiguo.Cómo usar Reflection para invocar un método sobrecargado en .NET

Sí, I podría simplemente lanzar el objeto como una instancia de mi clase base y llamar al método que necesito. Finalmente, ocurrirá, pero en este momento, las complicaciones internas no lo permitirán.

¡Cualquier ayuda sería genial! Gracias.

Respuesta

89

tiene que especificar el método que desea:

class SomeType 
{ 
    void Foo(int size, string bar) { } 
    void Foo() { } 
} 

SomeType obj = new SomeType(); 
// call with int and string arguments 
obj.GetType() 
    .GetMethod("Foo", new Type[] { typeof(int), typeof(string) }) 
    .Invoke(obj, new object[] { 42, "Hello" }); 
// call without arguments 
obj.GetType() 
    .GetMethod("Foo", new Type[0]) 
    .Invoke(obj, new object[0]); 
+0

funcionó como un amuleto !!! Desearía tener esta publicación hace una hora :) –

+5

También puedes hacer Type.EmptyTypes –

+2

necesitar} después de "typeof (int), typeof (string)" para compilar :) –

14

Sí. Cuando invoque el método, pase los parámetros que coincidan con la sobrecarga que desee.

Por ejemplo:

Type tp = myInstance.GetType(); 

//call parameter-free overload 
tp.InvokeMember("methodName", BindingFlags.InvokeMethod, 
    Type.DefaultBinder, myInstance, new object[0]); 

//call parameter-ed overload 
tp.InvokeMember("methodName", BindingFlags.InvokeMethod, 
    Type.DefaultBinder, myInstance, new { param1, param2 }); 

Si lo hace al revés (es decir, mediante la búsqueda de la MemberInfo y llamar a Invoke) tener cuidado de que usted consigue la correcta - la sobrecarga libre de parámetro podría ser la primera encontró.

+0

Curiosamente, esto no funcionó. No pasé ningún parámetro a mi método sin parámetros, y aún recibí una llamada ambigua. –

+0

¿Cómo funciona esto con parámetros de diferentes tipos? Digamos que tengo dos sobrecargas donde una toma una cadena y la otra toma una int? – smaclell

+0

No hay problema: los tipos subyacentes de los parámetros son los que se comprueban. – Keith

5

Utilice la sobrecarga GetMethod que toma un System.Type [], y pase un Tipo vacío [];

typeof (Class).GetMethod ("Method", new Type [ 0 ] { }).Invoke (instance, null); 
+3

Puede usar Type.EmptyTypes –

Cuestiones relacionadas