2016-09-15 3 views
0

C RecurringJob AddOrUpdate反射コールは、私は反射コールに、このメソッドを書き換える必要があることhangfire、#

public override string StartWork() 
{ 
     RecurringJob.AddOrUpdate<SomeScenario>(jobEntity.Name, x => x.Execute(jobEntity.Name), cron, TimeZoneInfo.Utc); 
} 

ようRecurringJobからAddOrUpdateメソッドを呼び出します。 私はDBに適切な型を持ち、私はだから

Type type = Type.GetType(jobEntity.ScenarioType); 
MethodInfo generic = addOrUpdate.MakeGenericMethod(type); 

のようにそれを得るだろう、今私はprooperパラメータを使用してこのメ​​ソッドを呼び出す必要があります。適切なメソッドオーバーロード

MethodInfo addOrUpdate = typeof(RecurringJob).GetMethods().Where(x => x.Name == "AddOrUpdate" && x.IsGenericMethod && x.IsGenericMethodDefinition).Select(m => new 
     { 
      Method = m, 
      Params = m.GetParameters(), 
      Args = m.GetGenericArguments() 
     }) 
       .Where(x => x.Params.Length == 5 
          && x.Params[0].ParameterType == typeof(string) 
          && x.Params[2].ParameterType == typeof(string) 
          && x.Params[3].ParameterType == typeof(TimeZoneInfo) 
          && x.Params[4].ParameterType == typeof(string) 
          ) 
       .Select(x => x.Method).FirstOrDefault(); 

を見つけました

public static void AddOrUpdate<T>(string recurringJobId, Expression<Action<T>> methodCall, string cronExpression, TimeZoneInfo timeZone = null, string queue = "default") 

問題:私はgeneric.Invoke(this, new object[] { jobEntity.Name, Expression<Action<T>>, cron, TimeZoneInfo.Utc, null });

は、任意の助けのために、あなたに多くのことを感謝呼び出すために、この場合にはExpression<Action<T>>を生成する方法がわかりません。

答えて

0
MethodInfo generic = addOrUpdate.MakeGenericMethod(scenarioType); 
ParameterExpression param = Expression.Parameter(scenarioType, "x"); 
ConstantExpression someValue = Expression.Constant(jobName, typeof(string)); 
MethodCallExpression methodCall = Expression.Call(param, scenarioType.GetMethod("Execute", new Type[] { typeof(string) }), someValue); 
LambdaExpression expre = Expression.Lambda(methodCall, new ParameterExpression[] { param }); 
generic.Invoke(self, new object[] { jobName, expre, cron, TimeZoneInfo.Utc, null }); 

作品:| |

関連する問題