Acción < T > llamar a un método basado en un valor de cadena
-
06-07-2019 - |
Pregunta
¿Hay alguna manera de usar Action para llamar a un método basado en un valor de cadena que contiene el nombre de ese método?
Solución
Action < T >
es solo un tipo de delegado que podría apuntar a un método dado. Si desea llamar a un método cuyo nombre solo se conoce en tiempo de ejecución, almacenado en una variable de cadena, debe usar la reflexión:
class Program
{
static void Main(string[] args)
{
string nameOfTheMethodToCall = "Test";
typeof(Program).InvokeMember(
nameOfTheMethodToCall,
BindingFlags.NonPublic | BindingFlags.InvokeMethod | BindingFlags.Static,
null,
null,
null);
}
static void Test()
{
Console.WriteLine("Hello from Test method");
}
}
Según lo sugerido por @Andrew, podría usar Delegate.CreateDelegate para crear un tipo de delegado a partir de MethodInfo:
class Program
{
static void Main(string[] args)
{
string nameOfTheMethodToCall = "Test";
var mi = typeof(Program).GetMethod(nameOfTheMethodToCall, BindingFlags.NonPublic | BindingFlags.InvokeMethod | BindingFlags.Static);
var del = (Action)Delegate.CreateDelegate(typeof(Action), mi);
del();
}
static void Test()
{
Console.WriteLine("Hello from Test method");
}
}
Otros consejos
No creo que realmente quieras una Acción < T >
solo un método normal.
public void CallMethod<T>(T instance, string methodName) {
MethodInfo method = typeof(T).GetMethod(methodName);
if (method != null) {
method.Invoke(instance, null);
}
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow