2016-08-12 1 views
1

저는 Hangfire를 사용하고 간단한 작업을 예약하려고합니다. 지정된 시간에 트리거 될 메소드의 이름을 하드 코드화하면 작동하지만보다 일반적인 것을 원합니다. 즉 모든 메소드를이 코드에 전달하고 Hangfire가 스케줄에 따라 실행하도록합니다.하드 코딩 된 메서드 이름 대신 Hangfire Scheduler의 다른 메서드에 메서드 전달

여기 제가 시도한 방법 중 하나입니다. 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을 <>를 시도, 위임이 - 아무 일 없습니다. 그냥 하드 코딩하는 대신 Hangfire하는 방법 이름/참조를 전달하는 방법이 -

BackgroundJob.Schedule(() => TestClass.TestMethod(parametersStorage, secondsDelay) 

내가 무슨 일을하고있는 중이 야 : 만 명시 적으로 메소드 이름을 작품 지정?

+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()); 
    } 
} 
관련 문제