私はHangfireを使用しており、単純なジョブをスケジュールするだけです。指定した時刻にトリガされるメソッドの名前をハードコードする場合に機能しますが、より汎用的なもの、つまり任意のメソッドをこのコードに渡して、Hangfireにスケジュール通りに実行させることができます。ハードコードされたメソッド名を使用する代わりに、メソッドをHangfire Schedulerの別のメソッドに渡す
ここで私が試した方法の1つです。
のtestMethodは、同じクラスのメソッドの名前であるHangfireScheduler.ScheduleSingleRun(parameters, TestMethod, 15);
:
public static void ScheduleSingleRun(Activity parametersStorage, Action<Activity, int> scheduledFunction, int secondsDelay)
{
TimeSpan offset = new TimeSpan(0, 0, secondsDelay);
try
{
BackgroundJob.Schedule(() =>
scheduledFunction(parametersStorage, secondsDelay), offset);
return new HangfireSchedulerResponse("Scheduled successfully.", 0);
...
そして、ここでは、私は、この関数を呼び出す方法です。
このコードはコンパイルされますが、実行しているときに、このエラーが発生します。
Expression body should be of type `MethodCallExpression`"
私は委任、アクション、のFunc <>を試してみました - 何も働きました。のみを指定する明示的なメソッド名が作品:私が間違って何を
BackgroundJob.Schedule(() => TestClass.TestMethod(parametersStorage, secondsDelay)
やっている - ちょうどメソッド名/ Hangfireへの参照の代わりに、それをハードコーディングを渡す方法はありますか?
: System.Linq.Expressions.Expression.Call(...); 基本的には、式を渡す必要があります。独自の式ツリーを手動で作成して渡します。 more info here => https://blogs.msdn.microsoft.com/charlie/2008/01/31/expression-tree-basics/ – user1845593
「ラムダ式の文字列からメソッドを動的に作成する方法」の可能な複製(http: //stackoverflow.com/questions/26411278/how-to-dynamically-create-method-from-string-for-lambda-expression) – jtabuloc