Necesitará usar Type.GetMethod
para obtener el método correcto, y Delegate.CreateDelegate
para convertir el MethodInfo
en un delegado. Ejemplo completo:
using System;
using System.Reflection;
delegate string MyDelegate();
public class Dummy
{
public override string ToString()
{
return "Hi there";
}
}
public class Test
{
static MyDelegate GetByName(object target, string methodName)
{
MethodInfo method = target.GetType()
.GetMethod(methodName,
BindingFlags.Public
| BindingFlags.Instance
| BindingFlags.FlattenHierarchy);
// Insert appropriate check for method == null here
return (MyDelegate) Delegate.CreateDelegate
(typeof(MyDelegate), target, method);
}
static void Main()
{
Dummy dummy = new Dummy();
MyDelegate del = GetByName(dummy, "ToString");
Console.WriteLine(del());
}
}
comentario de Mehrdad es un gran día, aunque - si las excepciones lanzadas por esta sobrecarga de Delegate.CreateDelegate están bien, puede simplificar GetByName
significativamente:
static MyDelegate GetByName(object target, string methodName)
{
return (MyDelegate) Delegate.CreateDelegate
(typeof(MyDelegate), target, methodName);
}
nunca he utilizado yo mismo , debido a que normalmente hago otros bits de comprobación después de encontrar el MethodInfo
explícitamente - pero donde es adecuado, esto es muy útil :)
'retorno (MyDelegate) Delegate.CreateDelegate (typeof (MyDelegate), objetivo, methodName);' no lo haría? –
Lo haría, a menos que esté usando XNA o Compact Framework. Entonces, la solución de Jon debe ser utilizada. –
Guau, en efecto, siempre que no se necesite una verificación de errores. Editaré ... –