2016-08-12 12 views
1

私は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への参照の代わりに、それをハードコーディングを渡す方法はありますか?

+0

: System.Linq.Expressions.Expression.Call(...); 基本的には、式を渡す必要があります。独自の式ツリーを手動で作成して渡します。 more info here => https://blogs.msdn.microsoft.com/charlie/2008/01/31/expression-tree-basics/ – user1845593

+0

「ラムダ式の文字列からメソッドを動的に作成する方法」の可能な複製(http: //stackoverflow.com/questions/26411278/how-to-dynamically-create-method-from-string-for-lambda-expression) – jtabuloc

答えて

0

次の例を参照してください。あなたの場合、私はあなたが式を渡さなければならないと思います。私の例では、 "lambda"変数をBackgroundJob.Scheduleメソッドに渡す必要があります。ただ、私はあなたのような何かを渡すべきだと思うの例外を見て

class Program 
{ 
    static void Main(string[] args) 
    { 
     int param1Value = 2; 
     object param2Value = "hello"; 

     var param1 = Expression.Parameter(typeof(int)); 
     var param2 = Expression.Parameter(typeof(object)); 

     var testMethodInfo = typeof(MyClass).GetMethod("TestMethod", BindingFlags.Public | BindingFlags.Static); 
     var exp = Expression.Call(testMethodInfo, param1, param2); 

     var lambda = Expression.Lambda<Action<int, object>>(exp, param1, param2); 

     lambda.Compile().Invoke(param1Value, param2Value); 
    } 
} 

static class MyClass 
{ 
    public static void TestMethod(int param1, object param2) 
    { 
     Console.WriteLine(param1); 
     Console.WriteLine(param2?.ToString()); 
    } 
} 
関連する問題