我的最终目标是创建一个函数,将方法名称动态传递给 Hangfire 库中的类。
例如,以下是有效的非动态代码:
RecurringJob.AddOrUpdate(() => myFunction(), Cron.Hourly)
AddOrUpdate 第一个参数的类型是Expression<Action>
。我的第一步是使用反射动态插入函数名称:
Type thisControllerType = this.GetType();
MethodInfo method = thisControllerType.GetMethod(methodName); //methodName passed as string parameter
RecurringJob.AddOrUpdate(() => method.Invoke(this, null), Cron.Hourly);
当我检查 Hangfire 仪表板时,似乎该表达式被评估为MethodBase.Invoke
。所以我需要帮助动态传递方法名称。
这可能足以回答我的问题,但我采取的另一条途径是尝试生成参数的完整表达式。
RecurringJob.AddOrUpdate(CreateCallExpression(method), Cron.Hourly);
public Expression<Action> CreateCallExpression(MethodInfo method)
{
//trying to pass in zero argument parameter, not sure if this syntax is correct
var parameter = System.Linq.Expressions.Expression.Parameter(typeof (Array));
return System.Linq.Expressions.Expression.Lambda<Action>(System.Linq.Expressions.Expression.Call(method, parameter));
}
在这种情况下,我收到异常{“静态方法需要空实例,非静态方法需要非空实例。\r\n参数名称:方法”}。我正在努力,但不确定这是否是我应该走的路。我一整天都在研究这个问题,所以我希望有人能够帮助我加快学习速度。