Выполнить функцию из переменной в C # - PullRequest
4 голосов
/ 03 января 2011

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

variable+"()";

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

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

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

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

Ответы [ 11 ]

9 голосов
/ 03 января 2011

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

switch (variable) {
  case "OneMethod": OneMethod(); break;
  case "OtherMethod": OtherMethod(); break;
}
5 голосов
/ 03 января 2011

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

3 голосов
/ 03 января 2011

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

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

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

2 голосов
/ 03 января 2011

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

открытый делегат void TestDelegate ();

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

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

                testDelegate();
        }
}
1 голос
/ 03 января 2011
string className = "My.Program.CoolClass"; //including namespace
string method= "Execute";
var type = Type.GetType(className);
var method = type.GetMethod(method);
method.Invoke(classObj, null);
1 голос
/ 03 января 2011

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

Type yourtype = yourObject.GetType();

MethodInfo method = yourtype.GetMethod(variable);
var result = method.Invoke(yourObject,null);
0 голосов
/ 26 сентября 2017

(я закончу отличный ответ @ Мэтью):

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

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

private Dictionary<string, dynamic> my =  new Dictionary<string, dynamic>();
my["x"]  = .....
my["x"]();
0 голосов
/ 28 апреля 2014
public class FunctionTest
{

    void Main()
    {
        Action doSomething;

        doSomething = FirstFunction;
        doSomething();

        doSomething = SecondFunction;
        doSomething();
    }

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

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

выход:

Привет, мир!

Не намного проще, чем это.

0 голосов
/ 03 января 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);
0 голосов
/ 03 января 2011
...