最終的な目標は、メソッド名を 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));
}
この場合、{"静的メソッドには null インスタンスが必要です。非静的メソッドには非 null インスタンスが必要です。\r\nパラメータ名: メソッド"} という例外が発生します。私はそれに取り組んでいますが、これが私が進むべき道であるかどうかはわかりません. 私はこれに一日中取り組んでいるので、誰かが私の学習をスピードアップするのを手伝ってくれることを望んでいました.