Нужно создать Expression‹Action› из строк

Hangfire — это средство запуска методов фонового класса, а его повторяющаяся функция задания RecurringJob.AddOrUpdate(Expression‹ Action >,string) — это метод, используемый для добавления методов в очередь. Первый параметр — это вызов Action, а второй — строка в формате cron.

Если у меня есть строки имени класса и функции, как я могу добавить задание.

Пример обычного нестрокового вызова:

RecurringJob.AddOrUpdate(() => new MyClass().MyMethod(), "0 0 * * *");

Я хотел бы сделать что-то вроде

string myClassString = GetMyClassFromConfig();//value "MyNamespace.MyClass";
string myMethodString = GetMyMethodFromConfig();//value "MyMethod";
string myCronString = GetMyCronFromConfig();// value "0 0 * * *"
Type myType = Type.GetType(myClassString);
var myMethod = myType.GetMethod(myMethodString);
var myInstance = Expression.Parameter(myType,"instanceName");
RecurringJob.AddOrUpdate(Expression.Call(myInstance,myMethod), myCronString);

но это вызывает ошибку при вызове метода AddOrUpdate:

Не удалось создать экземпляр типа System.Linq.Expressions.Expression. Тип является интерфейсом или абстрактным классом и не может быть создан. Путь «Тип», строка 1, позиция 8.

Как мне добавить задания через определения строк или как сделать выражение ‹ действие > из строк, которые позволили бы создавать экземпляр объекта и запускать метод (new MyClass().Run()), показанный в верхнем примере?


person gjutras    schedule 29.10.2015    source источник
comment
Возможный дубликат Как преобразовать строку в ее эквивалентное выражение Дерево?   -  person DLeh    schedule 29.10.2015
comment
Строка эквивалентного вопроса/ответа дерева выражений не помогает мне вернуть Expression‹Action› или Expression‹Func‹T,object›› из строк, где Action или Func могут быть инклюзивными, или экземпляр объекта (new MyClass( )) который требуется для метода addorupdate Hangfire.   -  person gjutras    schedule 29.10.2015
comment
попытка проанализировать и запустить Action будет похожа на запуск динамического кода, что, вероятно, невозможно в С# stackoverflow.com/questions/4629/   -  person DLeh    schedule 29.10.2015
comment
@DLeh Вы неверно истолковываете ответ на этот вопрос. Это возможно, просто не встроено и требует дополнительной работы. А для некоторых простых функций DataBinder.Eval может сделать это из коробки.   -  person Scott Chamberlain    schedule 29.10.2015


Ответы (1)


Следующее сделает работу

// ... (same as yours except the last 2 lines)
var myAction = Expression.Lambda<Action>(Expression.Call(Expression.New(myType), myMethod));
RecurringJob.AddOrUpdate(myAction, myCronString);
person Ivan Stoev    schedule 29.10.2015
comment
спасибо, я пропустил выражение.new и сделал его выражением через вызов Lambda‹›. - person gjutras; 29.10.2015