3

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

4

1 に答える 1