1

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()) 的字符串中创建表达式<Action>,如上例所示?

4

1 回答 1

2

以下将完成这项工作

// ... (same as yours except the last 2 lines)
var myAction = Expression.Lambda<Action>(Expression.Call(Expression.New(myType), myMethod));
RecurringJob.AddOrUpdate(myAction, myCronString);
于 2015-10-29T14:05:45.293 回答