Подтвердить что ты не робот

Как динамически вызывать функцию в С#

У меня есть метод:

  add(int x,int y)

и я также имеют:

int a=5;
int b=6;
string s="add";

Можно ли вызвать add (a, b), используя строку s? как я могу сделать это в С#?

4b9b3361

Ответ 1

как я могу сделать это в С#?

Использование отражения.

add должен быть членом некоторого типа, поэтому (вырезание большого количества деталей):

typeof(MyType).GetMethod("add").Invoke(null, new [] {arg1, arg2})

Это предполагает, что add является статическим (в противном случае первым аргументом для Invoke является объект), и мне не нужны дополнительные параметры, чтобы однозначно идентифицировать метод в вызове GetMethod.

Ответ 2

Использовать отражение - попробуйте метод Type.GetMethod

Что-то вроде

MethodInfo addMethod = this.GetType().GetMethod("add");
object result = addMethod.Invoke(this, new object[] { x, y } );

Вы теряете сильную типизацию и проверку времени компиляции - invoke не знает, сколько параметров ожидает метод, и каковы их типы и каков фактический тип возвращаемого значения. Таким образом, все может потерпеть неудачу во время выполнения, если вы не понимаете это правильно.

Он также медленнее.

Ответ 3

Если функции известны во время компиляции, и вы просто хотите избежать написания оператора switch.

Настройка:

Dictionary<string, Func<int, int, int>> functions =
  new Dictionary<string, Func<int, int, int>>();

functions["add"] = this.add;
functions["subtract"] = this.subtract;

Вызывается:

string functionName = "add";
int x = 1;
int y = 2;

int z = functions[functionName](x, y);

Ответ 4

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

using System;
using System.Reflection;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();
            Type t = p.GetType();
            MethodInfo mi = t.GetMethod("add", BindingFlags.NonPublic | BindingFlags.Instance);
            string result = mi.Invoke(p, new object[] {4, 5}).ToString();
            Console.WriteLine("Result = " + result);
            Console.ReadLine();
        }

        private int add(int x, int y)
        {
            return x + y;
        }
    }
}

Ответ 5

Ответ на

@Richard велик. Просто немного его развернуть:

Это может быть полезно в ситуации, когда вы динамически создавали объект неизвестного типа и должны вызывать его метод:

var do = xs.Deserialize(new XmlTextReader(ms)); // example - XML deserialization
do.GetType().GetMethod("myMethodName").Invoke(do, new [] {arg1, arg2});

becasue во время компиляции do - это просто Object.