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

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

variable+"()";

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

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

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

if (variable == var1)
{
var1();
}
if (variable == var2)
{
var2();
}

person Sean    schedule 03.01.2011    source источник
comment
Шон, я думаю, тебе нужно изменить принятый ответ на ответ @Matthew, потому что он отвечает на тему. Ответ Гуффы на самом деле не является ответом на эту тему.   -  person T.Todua    schedule 26.09.2017
comment
p.s. Я добавил еще один полный пример.   -  person T.Todua    schedule 26.09.2017


Ответы (10)


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

switch (variable) {
  case "OneMethod": OneMethod(); break;
  case "OtherMethod": OtherMethod(); break;
}
person Guffa    schedule 03.01.2011

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

person C.Evenhuis    schedule 03.01.2011

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

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

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

person Matthew Flaschen    schedule 03.01.2011

Вы можете использовать делегатов. 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();
        }
}
person Chandu    schedule 03.01.2011

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

Type yourtype = yourObject.GetType();

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

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

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

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

person Tor Andersson    schedule 03.01.2011

Вы можете использовать MethodMethodInfo.
http://msdn.microsoft.com/en-us/library/system.reflection.methodinfo.aspx
http://msdn.microsoft.com/en-us/library/a89hcwhh.aspx

person Kai    schedule 03.01.2011

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

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);
person M4N    schedule 03.01.2011

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

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

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

private Dictionary<string, dynamic> my =  new Dictionary<string, dynamic>();
my["x"]  = .....
my["x"]();
person T.Todua    schedule 26.09.2017

public class FunctionTest
{

    void Main()
    {
        Action doSomething;

        doSomething = FirstFunction;
        doSomething();

        doSomething = SecondFunction;
        doSomething();
    }

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

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

выход:

Привет, мир!

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

person nathanchere    schedule 28.04.2014