Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Выполнить функцию из переменной в C#

Автор вопроса: SeanОтветов: 10

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

variable+"()";

или что-то в этом роде, или мне придется использовать операторы if?

Кажется, что ответом может быть переключатель, поэтому, если значение переменной = var1, я хочу, чтобы он выполнялся var1(); если значение равно var2, я хочу, чтобы оно выполнялось var2(); как бы я это закодировал?

В основном, я пытаюсь найти более чистую альтернативу

if (variable == var1)
{
var1();
}
if (variable == var2)
{
var2();
}
  • Шон, я думаю, тебе нужно изменить принятый ответ на ответ @Matthew, потому что он отвечает на тему. Ответ Гуффы на самом деле не является ответом на эту тему. T.Todua 26.09.2017
  • p.s. Я добавил еще один полный пример. T.Todua 26.09.2017

variablesfunctionif-statement

Ответы

Ответ 1 · рейтинг 9 · Guffa

Можно было бы использовать отражение, чтобы найти метод в объекте и вызвать этот метод, но самым простым и быстрым было бы просто использовать переключатель:

switch (variable) {
  case "OneMethod": OneMethod(); break;
  case "OtherMethod": OtherMethod(); break;
}

Ответ 2 · рейтинг 5 · C.Evenhuis

Вы можете использовать Reflection http://msdn.microsoft.com/en-us/library/ms173183(v=vs.80).aspx для доступа к любой функции или члену по имени. Хотя это требует некоторого привыкания. У него также есть проблемы с производительностью, поэтому, если вы можете избежать его использования, вам следует это сделать.

Ответ 3 · рейтинг 3 · Matthew Flaschen

Вот для чего нужны делегаты:

Action f = ()=>Console.WriteLine("foo");
f();

Я предполагаю, что использование строк на самом деле не является обязательным требованием.

Ответ 4 · рейтинг 2 · Chandu

Вы можете использовать делегатов. MSDN: http://msdn.microsoft.com/en-us/library/900fyy8e%28v=vs.71%29.aspx Пример:

публичный делегат недействителен TestDelegate();

class TestDelegate
{
        public static void Test()
        {
                Console.WriteLine("In Test");
        }

        public static void Main()
        {
                TestDelegate testDelegate = new TestDelegate(Test);

                testDelegate();
        }
}

Ответ 5 · рейтинг 1 · Gregoire

Вы можете использовать класс MethodInfo.

Type yourtype = yourObject.GetType();

MethodInfo method = yourtype.GetMethod(variable);
var result = method.Invoke(yourObject,null);

Ответ 6 · Tor Andersson

Проверьте этот пост.

Используйте отражение.

http://dotnetslackers.com/Community/blogs/haissam/archive/2007/07/25/Call-a-function-using-Reflection.aspx

Ответ 8 · M4N

Вот пример вызова метода через отражение:

public class MyClass
{
    public void PrintHello()
    {
        Console.WriteLine("Hello World");
    }
}

//...

public void InvokeMethod(object obj, string method)
{
  // call the method
  obj.GetType().GetMethod(method).Invoke(obj, null);
}

//...
var o = new MyClass();
var method = "PrintHello";
//...
InvokeMethod(o, method);

Ответ 9 · T.Todua

(я закончу отличный ответ @Matthew):

var x =  (Action) ( ()=>Print("foo") );
x();

p.s. вы также можете полностью менять имена:

private Dictionary<string, dynamic> my =  new Dictionary<string, dynamic>();
my["x"]  = .....
my["x"]();

Ответ 10 · рейтинг -1 · nathanchere

public class FunctionTest
{

    void Main()
    {
        Action doSomething;

        doSomething = FirstFunction;
        doSomething();

        doSomething = SecondFunction;
        doSomething();
    }

    void FirstFunction()
    {
        Console.Write("Hello, ");
    }

    void SecondFunction()
    {
        Console.Write("World!\n");
    }
}

выход:

Привет, мир!

Не бывает намного проще.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы