Action para chamar um método com base em um valor de string
-
06-07-2019 - |
Pergunta
Existe uma maneira de usar a ação para chamar um método com base em um valor de cadeia que contém o nome desse método?
Solução
Action<T>
é apenas um tipo delegado que poderia apontar para um determinado método. Se você quiser chamar um método cujo nome é conhecido apenas em tempo de execução, armazenado em uma variável string, você precisa ter que usar a reflexão:
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");
}
}
Como sugerido por @ Andrew você poderia usar Delegate.CreateDelegate para criar um tipo de delegado de um 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");
}
}
Outras dicas
Eu não acho que você realmente quer uma Action<T>
apenas um método regular.
public void CallMethod<T>(T instance, string methodName) {
MethodInfo method = typeof(T).GetMethod(methodName);
if (method != null) {
method.Invoke(instance, null);
}
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow