【问题标题】:How to pass a dynamically typed Action<T> to a method如何将动态类型的 Action<T> 传递给方法
【发布时间】:2016-03-31 12:21:16
【问题描述】:

我有一个接受Action&lt;T&gt; 的 3d 派对作业执行库(hangfire):

Add(Action<T> action);

我可以很容易地这样称呼:

Add((MyJob job) => job.Run());

但我想通过反射动态加载作业,所以我有一个可以使用的类名“MyNamespace.MyJob”。我无法弄清楚如何使用反射创建所需的参数。

附:该类实现了 IJob,但遗憾的是我不能使用 Action&lt;IJob&gt;,因为 hangfire 稍后将使用该参数从 DI 容器中解析。

【问题讨论】:

  • Hangfire 如何提供该参数?
  • 不确定你是不是这个意思:RecurringJob.AddOrUpdate(Action action)

标签: c# generics lambda delegates


【解决方案1】:

看起来 Hangfire 使用 type 参数来要求 DI 容器提供一个值。这就是为什么委托实际上需要具有正确的类型。使用Action&lt;object&gt; 将不起作用。

static void AddToHangfire<T>() where T : ICommand {
 Add((T job) => job.Run());
}

现在您需要使用反射来调用该方法。你可以使用MethodInfo.MakeGenericMethodMethodInfo.Invoke 来做到这一点。

【讨论】:

  • 非常感谢,这确实奏效了。我使用了 typeof().GetMethod().MakeGenericMethod().Invoke()。我试图创建一个非常困难的 Action,但是使用内部具有 Action 的方法的这种解决方法非常棒:)
  • 是的,这是一种常见的反射技巧。你只需要做一次讨厌的事情。
  • 你能添加部分回答用法吗?
猜你喜欢
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-20
  • 1970-01-01
  • 2020-08-05
  • 1970-01-01
相关资源
最近更新 更多