需要创建表达式<;操作>;来自字符串
本文关键字: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);