Может ли это также использоваться для вызова функции с параметром: например, строка f = "метод (параметр1, параметр2)";
Гром
Спасибо @ottobar за ответ. Я не знаю, если это то, что я тоже ищу: мне нужно было использовать скалярную функцию SQL в моем коде c #. Как я это называю?
Чагберт
1
К вашему сведению, это не сработает, если у вас перегружены методы.
Шон О'Нил
С приведенным выше кодом - метод, который вызывается должен иметь модификатор доступа - PUBLIC. Если не публично, используйте флаги Binding - BindingFlags.NonPublic | BindingFlags.Instance .. Type thisType = this.GetType(); MethodInfo theMethod = thisType.GetMethod(TheCommandString, BindingFlags.NonPublic | BindingFlags.Instance); theMethod.Invoke(this, userParameters);
Sibgath
75
Вы можете вызывать методы экземпляра класса, используя отражение, делая динамический вызов метода:
Предположим, что у вас есть метод hello в фактическом экземпляре (this):
string methodName ="hello";//Get the method information using the method info classMethodInfo mi =this.GetType().GetMethod(methodName);//Invoke the method// (null- no parameter for the method call// or you can pass the array of parameters...)
mi.Invoke(this,null);
как насчет методов из "строкового" класса? использование фреймворка 4
Леандро
36
classProgram{staticvoidMain(string[] args){Type type =typeof(MyReflectionClass);MethodInfo method = type.GetMethod("MyMethod");MyReflectionClass c =newMyReflectionClass();string result =(string)method.Invoke(c,null);Console.WriteLine(result);}}publicclassMyReflectionClass{publicstringMyMethod(){returnDateTime.Now.ToString();}}
Небольшая касательная - если вы хотите проанализировать и оценить всю строку выражения, которая содержит (вложенные!) Функции, рассмотрите NCalc ( http://ncalc.codeplex.com/ и nuget)
Ex. немного изменен из проектной документации:
// the expression to evaluate, e.g. from user input (like a calculator program, hint hint college students)var exprStr ="10 + MyFunction(3, 6)";Expression e =newExpression(exprString);// tell it how to handle your custom function
e.EvaluateFunction+=delegate(string name,FunctionArgs args){if(name =="MyFunction")
args.Result=(int)args.Parameters[0].Evaluate()+(int)args.Parameters[1].Evaluate();};// confirm it workedDebug.Assert(19== e.Evaluate());
А внутри EvaluateFunctionделегата вы бы назвали свою существующую функцию.
Фактически я работаю над Windows Workflow 4.5, и мне удалось найти способ передать делегат из машины состояний в метод безуспешно. Единственный способ найти меня - это передать строку с именем метода, который я хотел передать как делегат, и преобразовать строку в делегат внутри метода. Очень хороший ответ. Спасибо. Проверьте эту ссылку https://msdn.microsoft.com/en-us/library/53cz7sc6(v=vs.110).aspx
Добро пожаловать на ТАК! Мне нравится ваш ответ, не могли бы вы объяснить немного больше о том, что вы делаете?
a.deshpande012
Привет, конечно. Это консольное приложение .net, внутри «класса программы» есть несколько методов или функций, например: hello, hello2, hello2. Поиск метода "CallMethod (string method)" и позвольте мне вызвать любой метод внутри "класса программы", вызванный его именем в качестве строкового параметра. Когда я запускаю приложение из «Консоли Windows»: я пишу: «имя приложения» + «метод, который мне нужно вызвать». Например: myapp hello, затем верните «hello world!». Может быть также «myapp hello2» или «myapp hello3». Я думаю, что может работать в любом приложении .Net.
Ранобе
Вы должны добавить класс Reflection: «using System.Reflection;».
public
также.Ответы:
Да. Вы можете использовать отражение. Что-то вроде этого:
источник
Type thisType = this.GetType(); MethodInfo theMethod = thisType.GetMethod(TheCommandString, BindingFlags.NonPublic | BindingFlags.Instance); theMethod.Invoke(this, userParameters);
Вы можете вызывать методы экземпляра класса, используя отражение, делая динамический вызов метода:
Предположим, что у вас есть метод hello в фактическом экземпляре (this):
источник
источник
Небольшая касательная - если вы хотите проанализировать и оценить всю строку выражения, которая содержит (вложенные!) Функции, рассмотрите NCalc ( http://ncalc.codeplex.com/ и nuget)
Ex. немного изменен из проектной документации:
А внутри
EvaluateFunction
делегата вы бы назвали свою существующую функцию.источник
Фактически я работаю над Windows Workflow 4.5, и мне удалось найти способ передать делегат из машины состояний в метод безуспешно. Единственный способ найти меня - это передать строку с именем метода, который я хотел передать как делегат, и преобразовать строку в делегат внутри метода. Очень хороший ответ. Спасибо. Проверьте эту ссылку https://msdn.microsoft.com/en-us/library/53cz7sc6(v=vs.110).aspx
источник
источник
В C # вы можете создавать делегаты как указатели на функции. Проверьте следующую статью MSDN для получения информации об использовании:http://msdn.microsoft.com/en-us/library/ms173171(VS.80).aspx
источник