Действие & л; Т & GT; вызвать метод на основе строкового значения
-
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);
}
}
Не связан с StackOverflow