需要从字符串创建Expression <action>

时间:2015-10-29 12:43:46

标签: c# linq hangfire

Hangfire是一个后台类方法运行器,它是重复出现的工作函数 RecurringJob.AddOrUpdate(Expression&lt; Action&gt;,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&lt;行动&gt;来自允许对象实例化和方法运行的字符串(new MyClass()。Run())显示在上面的示例中?

1 个答案:

答案 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);