Действие & л; Т & GT; вызвать метод на основе строкового значения

StackOverflow https://stackoverflow.com/questions/1813596

  •  06-07-2019
  •  | 
  •  

Вопрос

Есть ли способ использовать Action для вызова метода на основе строкового значения, содержащего имя этого метода?

Это было полезно?

Решение

Action < T > - это просто тип делегата, который может указывать на данный метод. Если вы хотите вызвать метод, имя которого известно только во время выполнения и хранится в строковой переменной, вам необходимо использовать отражение:

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");
    }
}
<Ч>

В соответствии с предложением @Andrew вы можете использовать Delegate.CreateDelegate для создания типа делегата из 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");
    }
}

Другие советы

Я не думаю, что вы действительно хотите Action < T > просто обычный метод.

public void CallMethod<T>(T instance, string methodName) { 
    MethodInfo method = typeof(T).GetMethod(methodName);
    if (method != null) {
        method.Invoke(instance, null);
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top