У меня есть метод:
add(int x,int y)
и я также имеют:
int a=5;
int b=6;
string s="add";
Можно ли вызвать add (a, b), используя строку s? как я могу сделать это в С#?
У меня есть метод:
add(int x,int y)
и я также имеют:
int a=5;
int b=6;
string s="add";
Можно ли вызвать add (a, b), используя строку s? как я могу сделать это в С#?
как я могу сделать это в С#?
Использование отражения.
add
должен быть членом некоторого типа, поэтому (вырезание большого количества деталей):
typeof(MyType).GetMethod("add").Invoke(null, new [] {arg1, arg2})
Это предполагает, что add
является статическим (в противном случае первым аргументом для Invoke
является объект), и мне не нужны дополнительные параметры, чтобы однозначно идентифицировать метод в вызове GetMethod
.
Использовать отражение - попробуйте метод Type.GetMethod
Что-то вроде
MethodInfo addMethod = this.GetType().GetMethod("add");
object result = addMethod.Invoke(this, new object[] { x, y } );
Вы теряете сильную типизацию и проверку времени компиляции - invoke не знает, сколько параметров ожидает метод, и каковы их типы и каков фактический тип возвращаемого значения. Таким образом, все может потерпеть неудачу во время выполнения, если вы не понимаете это правильно.
Он также медленнее.
Если функции известны во время компиляции, и вы просто хотите избежать написания оператора 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);
Вы можете использовать отражение.
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;
}
}
}
@Richard велик. Просто немного его развернуть:
Это может быть полезно в ситуации, когда вы динамически создавали объект неизвестного типа и должны вызывать его метод:
var do = xs.Deserialize(new XmlTextReader(ms)); // example - XML deserialization
do.GetType().GetMethod("myMethodName").Invoke(do, new [] {arg1, arg2});
becasue во время компиляции do
- это просто Object
.