2014-11-02 88 views
4

如何在Enqueue内运行methodCall?表达式<Action<T>> 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")); 
+0

这是可能的,但非常昂贵,因为您必须使用反映这一点。你为什么不通过Action而不是Action的表达? – galenus 2014-11-02 09:41:11

+1

@galenus:我在Hangfire.io中重载了一个方法,所以我不能控制该部分,因为头部必须匹配。 – bluee 2014-11-02 09:44:51

回答

5

为了实现这一目标,你需要的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参数。如果你能够从其他地方提供这个实例,那么你可以这样做。


UPDATE:

按照要求在评论部分在这里是如何使用Action<T>代替:

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"; 
} 
+1

对不起,我不能改变我称之为Enqueue的方式,因为它的超负荷 – bluee 2014-11-02 09:52:27

+0

好的,在这种情况下,只需使用'Action '来代替。但是,你需要从'Enqueue'函数中返回一些字符串值。没有办法从执行'Action '得到它,因为'Action '不会返回任何东西。 – 2014-11-02 09:53:12

+1

我不需要返回任何东西。我如何提取并运行Action ?谢谢 – bluee 2014-11-02 09:57:00

相关问题