2014-11-02 83 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

相關問題