see remarks method generate example documentacion delegados cref comentarios c# reflection delegates

c# - remarks - Obteniendo un delegado de methodinfo



remarks c# (2)

Tengo una lista desplegable que se completa inspeccionando los métodos de una clase e incluyendo aquellos que coinciden con una firma específica. El problema es tomar el elemento seleccionado de la lista y hacer que el delegado llame a ese método en la clase. El primer método funciona, pero no puedo descifrar parte del segundo.

Por ejemplo,

public delegate void MyDelegate(MyState state); public static MyDelegate GetMyDelegateFromString(string methodName) { switch (methodName) { case "CallMethodOne": return MyFunctionsClass.CallMethodOne; case "CallMethodTwo": return MyFunctionsClass.CallMethodTwo; default: return MyFunctionsClass.CallMethodOne; } } public static MyDelegate GetMyDelegateFromStringReflection(string methodName) { MyDelegate function = MyFunctionsClass.CallMethodOne; Type inf = typeof(MyFunctionsClass); foreach (var method in inf.GetMethods()) { if (method.Name == methodName) { //function = method; //how do I get the function to call? } } return function; }

¿Cómo puedo hacer funcionar la sección comentada del segundo método? ¿Cómo echo el MethodInfo al delegado?

¡Gracias!

Editar: Aquí está la solución de trabajo.

public static MyDelegate GetMyDelegateFromStringReflection(string methodName) { MyDelegate function = MyFunctionsClass.CallMethodOne; Type inf = typeof(MyFunctionsClass); foreach (var method in inf.GetMethods()) { if (method.Name == methodName) { function = (MyDelegate)Delegate.CreateDelegate(typeof(MyDelegate), method); } } return function; }


Tendrá que llamar a algún tipo de Delegate.CreateDelegate() , dependiendo de si el método en cuestión es un método estático o de instancia.


private static Delegate CreateDelegate(this MethodInfo methodInfo, object target) { Func<Type[], Type> getType; var isAction = methodInfo.ReturnType.Equals((typeof(void))); var types = methodInfo.GetParameters().Select(p => p.ParameterType); if (isAction) { getType = Expression.GetActionType; } else { getType = Expression.GetFuncType; types = types.Concat(new[] { methodInfo.ReturnType }); } if (methodInfo.IsStatic) { return Delegate.CreateDelegate(getType(types.ToArray()), methodInfo); } return Delegate.CreateDelegate(getType(types.ToArray()), target, methodInfo.Name); }