【问题标题】:Expression<Action<T>> methodCall表达式<Action<T>> 方法调用
【发布时间】:2014-11-02 09:38:15
【问题描述】:

如何在 Enqueue 中运行 methodCall?

public static string Enqueue<T>(System.Linq.Expressions.Expression<Action<T>> methodCall)
{
   // How to run methodCall with it's parameters? 
}

调用方法:

Enqueue<QueueController>(x => x.SomeMethod("param1", "param2"));

【问题讨论】:

  • 这是可能的,但非常昂贵,因为您必须为此使用反射。为什么不传递 Action 而不是 Expression of Action?
  • @galenus:我在 Hangfire.io 中重载了一个方法,所以我无法控制该部分,因为标题必须匹配。

标签: c# generics lambda


【解决方案1】:

为了实现这一点,您将需要一个T 的实例,以便您可以在此实例上调用该方法。此外,您的 Enqueue 必须根据您的签名返回一个字符串。所以:

public static string Enqueue<T>(System.Linq.Expressions.Expression<Func<T, string>> methodCall)
    where T: new()
{
    T t = new T();
    Func<T, string> action = methodCall.Compile();
    return action(t);
}

如您所见,我为T 参数添加了一个通用约束,以便能够获取实例。如果您能够从其他地方提供此实例,那么您可以这样做。


更新:

根据 cmets 部分的要求,这里是如何使用 Action&lt;T&gt; 代替:

public static string Enqueue<T>(System.Linq.Expressions.Expression<Action<T>> methodCall)
    where T: new()
{
    T t = new T();
    Action<T> action = methodCall.Compile();
    action(t);

    return "WHATEVER";
}

【讨论】:

  • 对不起,我不能改变我调用 Enqueue 的方式,因为它是一个重载
  • 好的,在这种情况下,只需使用 Action&lt;T&gt; 代替。但是您可以从Enqueue 函数中返回一些字符串值。没有办法从Action&lt;T&gt; 的执行中得到它,因为Action&lt;T&gt; 不返回任何东西。
  • 我不需要返回任何东西。如何提取和运行 Action ?谢谢
  • 当然,如果你的 Enqueue 方法的签名返回一个字符串,你需要返回一些东西!!!否则你的代码将无法编译。我将更新我的答案以说明如何使用Action&lt;T&gt; 来实现这一目标。
  • 我不知道 Hangfire.io 如何获取提取的参数,但我能够将其更改为扩展方法而不是重载,然后它就像一个魅力。感谢大家的帮助!背后的故事是 Hangfire.io 是一个作业调度程序,但如果后面的数据库失败,那么作业队列就会失败。所以我想重载方法以在作业失败时直接运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多