需要创建表达式<;操作>;来自字符串

本文关键字:gt 字符串 操作 lt 创建 表达式 | 更新日期: 2023-09-27 18:19:43

Hangfire是一个后台类方法运行程序,它的重复作业函数RecurringJob.AddOrUpdate(Expression<Action>,字符串)是用于将方法添加到队列的方法。第一个参数是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.Type是接口或抽象类,并且无法实例化。路径"Type",第1行,位置8。

我将如何通过字符串定义添加作业,或者我将如何使表达式<Action>来自允许对象实例化和方法运行(new MyClass().Run())的字符串,如上图所示?

需要创建表达式<;操作>;来自字符串

以下将完成的工作

// ... (same as yours except the last 2 lines)
var myAction = Expression.Lambda<Action>(Expression.Call(Expression.New(myType), myMethod));
RecurringJob.AddOrUpdate(myAction, myCronString);