Как вызвать функцию со строковой переменной в C# - PullRequest
1 голос
/ 23 апреля 2020

У меня есть функция, которой дается строка о том, какая функция вызывала ее. Есть ли способ для меня, чтобы вызвать эту функцию, используя строку?

void GameLoop()
{ 
  Example("GameLoop")
}

void Example(string functionThatCalledMe)
{
  // Call the method that called this using the string 'functionThatCalledMe'
  Call(functionThatCalledMe);
}

Я нашел решение в Вызов функции из строки в C#, я просто не понять, как это работает или как его использовать. Также, кажется, есть другая проблема, когда я не могу использовать this, поэтому я считаю, что это связано с этой проблемой.

Ответы [ 2 ]

4 голосов
/ 23 апреля 2020

this относится к экземпляру, в котором в данный момент выполняется код.

Я думаю, что вы, вероятно, добавляете this.GetType () к методу stati c. И метод stati c не связан с экземпляром, поэтому он не работает.

Type thisType = this.GetType();
MethodInfo theMethod = thisType.GetMethod(TheCommandString);
theMethod.Invoke(this, userParameters);

Работает так:

this.GetType
//or
typeof(ClassName)

Получает тип, который является классом. определение, которое вы можете использовать во время выполнения.

MethodInfo theMethod = thisType.GetMethod(TheCommandString);

пытается получить определение метода из типа. Затем это можно использовать для вызова (вызова)

theMethod.Invoke(this, userParameters);

Вызывает определение метода. Но так как определение метода не знает, к какому экземпляру он принадлежит, вам нужно передать экземпляр, а параметры - sh. (параметры не обязательны)

Примером может быть:

public static void Main()
{
    var test = new Test();

    Type thisType = test.GetType();
    MethodInfo theMethod = thisType.GetMethod("Boop");
    theMethod.Invoke(test , new object[0]);
}

public class Test
{
    public void Boop()
    {
        Console.WriteLine("Boop");
    }
}

. Код можно посмотреть по адресу:

https://dotnetfiddle.net/67ljft

3 голосов
/ 23 апреля 2020

Может ли это решение решить вашу проблему?

    class Program
    {
        private static Dictionary<string, Action> _myMethods;

        static Program()
        {
            _myMethods = new Dictionary<string, Action>();
            _myMethods.Add("Greet", Greet);
        }

        static void Main(string[] args)
        {

            InvokeMethod("Greet");
            Console.ReadKey();
        }

        private static void InvokeMethod(string methodNameToInvoke)
        {
            _myMethods[methodNameToInvoke].Invoke();
        }

        private static void Greet()
        {
            Console.WriteLine("Hello there!");
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...