У меня есть служба, которая имеет множество разных методов с множеством параметров. Я создал клиент службы, но было бы больно создавать интерфейс для всех возможных параметров и функций, поэтому у меня есть только одна кнопка для каждого метода, а код настраивает все параметры. Он работает хорошо, но каждый раз, когда вам нужен другой параметр, вам нужно изменить код. Поэтому я подумал, что если бы у меня было текстовое поле с кодом, который будет компилироваться и вызываться на лету, что было бы очень удобно использовать. Поэтому я хочу, чтобы у меня есть текстовое поле с кодом ExecuteOperation1("a", "b", "c")
, где ExecuteOperation определен в моем классе формы. И тогда я могу легко менять параметры на лету. Я попытался найти, как это можно сделать, но все примеры показывают компиляцию с пространствами имен и классами и так далее. Есть ли способ как-то запустить динамический код внутри вашего класса. Разумеется, оцениваются и другие простые решения для моей проблемы.Выполнение кода из текстового поля «на лету»
ответ
Существует несколько различных способов запуска кода на лету. Одним из приятных способов является использование предоставленного Microsoft файла dynamic.cs here (в LinqSamples \ DynamicQuery \ DynamicQuery). Примером использования является here.
Вы также можете сами построить деревья выражений вручную в соответствии с this article on MSDN. Но для этого вам нужно написать код разбора.
Я использовал оба вышеупомянутых, и я думаю, что первый подход кажется наиболее перспективным для проблемы, которую вы хотите решить. Например, вы можете сделать произвольный объект o
параметром вашего выражения и включить в него другие объекты, например settings
, поэтому пользователь может написать o.ExecuteOperation1("a", "b", "c", settings)
, как в приведенной ниже тестовой программе.
using System.Linq.Expressions;
using System.Linq.Dynamic;
// ...
public class Settings
{
public int x;
}
public class Window
{
public object ExecuteOperation1(string a, string b, string c, Settings s)
{
Console.WriteLine("{0}, {1}, {2}, {3}", a, b, c, s.x);
return true;
}
}
class Program
{
static void Main(string[] args)
{
string strExpr = "o.ExecuteOperation1(\"a\", \"b\", \"c\", settings)";
Window form = new Window();
Settings s = new Settings();
s.x = 42;
Type retType = typeof(object);
ParameterExpression[] paramExprs = new ParameterExpression[] {
Expression.Parameter(typeof(Window), "o"),
Expression.Parameter(typeof(Settings), "settings") };
LambdaExpression Le = System.Linq.Dynamic.DynamicExpression.ParseLambda(
paramExprs, retType, strExpr);
Delegate compiledLe = Le.Compile();
object result = compiledLe.DynamicInvoke(form, s);
Console.WriteLine("Result is {0}", result.ToString());
}
}
Эта программа выводит
a, b, c, 42
Result is True
мне пришлось закомментировать строки 1137 до 1138 в Dynamic.cs, чтобы получить эту работу (эти строки исключает использование определенного пользователем типа Window
).
И, наконец, есть Roslyn, что делает компилятор .net доступным как услугу. Я не использовал это сам, потому что это в техническом предпросмотре, и я хотел, чтобы я мог развернуть его сейчас. Тем не менее, похоже, у вас много примеров, некоторые из которых ориентированы на то, что вы хотите.
Спасибо за ответ. Мои параметры - это действительно объекты, которые я должен заполнить, и перейти к методу.Поэтому вместо строки «a» это должны быть параметры var = new. Настройки {\ * здесь установлены * *}, которые затем передаются методу. Можно ли писать и в выражении? –
Думаю, вам нужно поиграть с ним, чтобы посмотреть, что вы можете сделать. Я бы, вероятно, определил объекты настроек в отдельной части вашей формы, а затем дайте пользователю указать его (их) как часть строки, в которую они вписываются. Я изменил свой ответ, чтобы показать это. – TooTone
Самая важная часть - иметь этот код настроек из текстового поля, поэтому это не будет работать, как в вашем примере. Но я постараюсь понять, могу ли я изменить его, чтобы делать то, что хочу. Возможно, мы можем сделать один и тот же трюк с настройками и вернуть их как отдельное выражение, но все, что сделало бы эту вещь довольно сложной, и я хотел иметь только одно текстовое поле со всем кодом для операции: создание параметров объекта, вызов метода с этими параметрами , –
Если оно всегда выглядит как ExecuteOperation1("a", "b", "c")
, то вы можете использовать отражение для определения имен методов и параметров. Например, код folloring дает вам список методов. MethodInfo.Invoke может использоваться для вызова методов.
typeof(Service).GetMethods(BindingFlags.Public|BindingFlags.Instance);
Это подход не очень гибкий, но относительно прост для понимания и не требует дополнительных библиотек.
Это не совсем «а», «b», «c», это было просто упрощение, чтобы не вдаваться в подробности. У меня есть несколько сложных параметров объекта, которые я передаю, поэтому я не уверен, что это можно будет использовать. Самая интересная часть для меня - правильно заполнить свойства этих объектов –
- 1. eval() для выполнения кода из текстового поля
- 2. Rich текстового поля форматирования кода
- 3. Восстанавливающая версия кода «на лету» в Git
- 4. Выполнение PHP в Joomla Статья на лету?
- 5. PHP отладчик кода на лету
- 6. Обновления на лету кода orleans
- 7. Выполнение прокрутки UICollectioView при выборе текстового поля
- 8. Python Отладка: редактирование кода на лету
- 9. Выполнение текстового поля libgdx игнорирует определенные символы?
- 10. Выполнение текстового файла как исходного кода Python
- 11. Как проверить динамические поля (поля, созданные на лету)
- 12. Выполнение действия, если пользователь начинает удалять данные из текстового поля
- 13. Выполнение вызова с использованием значений из текстового поля
- 14. Выполнение кода из трубы
- 15. Выполнение нескольких запросов ADO.NET «на лету»
- 16. AppEngine: Запуск кода на Python на лету
- 17. Выполнение кода из памяти
- 18. JavaScript выполнение функции на ONBLUR случае текстового поля
- 19. Заполнение текстового поля после сканирования штрих-кода
- 20. Выбор текста на лету из текстового поля оставляет последний символ в javascript
- 21. Строка из текстового поля
- 22. Обновление текстового поля из java-кода (Android, Cordova, HTML5)
- 23. HTML: Выполнение надписей текстового поля. Как Facebook подписывают текстовые поля?
- 24. Как читать текст текстового поля, установленный JavaScript из кода позади?
- 25. Как получить «стиль» из классического текстового поля при загрузке кода?
- 26. Вставка десятичного кода из текстового поля в sql
- 27. Сохранение текстового ввода из прикрепленного текстового поля
- 28. Выполнение кода на C++ из python
- 29. Выполнение записи из кода на Ranorex
- 30. regex на строке из текстового поля
Вы уверены, что это [тег: генерация кода] вместо [tag: reflection]? –
Проверьте эту ссылку http://www.codeproject.com/Articles/12499/Run-Time-Code-Generation-I-Compile-C-Code-using-Mi – Kurubaran
@ J.A.I.L. Не совсем уверен, действительно, я не думаю, может быть, лучше вообще удалить тег. –