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。 Type是接口或抽象 class,无法实例化。路径'类型',第1行,第8位。
如何通过字符串定义添加作业或如何创建Expression<行动>来自允许对象实例化和方法运行的字符串(new MyClass()。Run())显示在上面的示例中?
答案 0 :(得分:2)
以下将完成这项工作
// ... (same as yours except the last 2 lines)
var myAction = Expression.Lambda<Action>(Expression.Call(Expression.New(myType), myMethod));
RecurringJob.AddOrUpdate(myAction, myCronString);