Есть ли способ, чтобы вы могли вызвать функцию с переменной?
variable+"()";
или что-то в этом роде, или мне придется использовать операторы if?
Кажется, что ответом может быть переключатель, поэтому, если значение переменной = var1, я хочу, чтобы он выполнялся var1(); если значение равно var2, я хочу, чтобы оно выполнялось var2(); как бы я это закодировал?
В основном, я пытаюсь найти более чистую альтернативу
if (variable == var1)
{
var1();
}
if (variable == var2)
{
var2();
}
Ответ 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);
Ответ 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"]();