2012-08-08 44 views
0

我試圖想到一個很好的方式調用任何類型的功能。無效或返回值,沒有參數或很多。我需要定時執行此功能,並希望將所有這些從客戶端隱藏起來。所以我只想給客戶端代碼一個方法來使用我的類來調用任何類型的函數,然後我的類將執行它並計時,然後返回到客戶端。C#中的通用方法調用任何函數並返回其返回值(如果有的話)?

部分我無法弄清楚是如何支持任何類型的功能。代表需要一個類型。 func需要回報。我想要一些通用的,使客戶端做最少量的工作來設置參數,最小的工作量來獲得返回值(如果有的話)。

這可能沒有反射?這裏的表現非常重要。

我能想象客戶端代碼看起來像這樣:

Recorder r = new Recorder(); 
r.Params.Add(param); 
r.Params.Add(param); 

r.CallFunc([function]); 

MyReturnType ret = (MyReturnType)r.returnValue; 

也似乎是可行的?

+1

你能給出的例子使用(或期望的使用)?一般來說,人們想用特定數量的參數(可能爲0)調用一個函數/委託,如果有結果,就用它做一些事情。 – 2012-08-08 03:21:20

+0

你如何知道要傳遞什麼參數值?您可能可以使用輕量級代碼生成(又名DynamicMethod)和/或表達式樹來做些什麼。但是你必須對這些參數做些什麼;你必須傳遞一些東西。 – 2012-08-08 03:27:01

+0

對,客戶將不得不做一些工作。他們將不得不用他們的參數來建立呼叫,並且做一些更多的工作以及返回值(如果有的話)。這部分沒有辦法。但建立一個足夠通用的類來處理這是我無法弄清楚的。 – ijjo 2012-08-08 03:28:52

回答

0

你可以只超載方法。

void MyMetaFunction(Action action); 
void MyMetaFunction<T>(Action<T> action, T arg); 
TResult MyMetaFunction<TResult>(Func<TResult> func); 
TResult MyMetaFunction<TResult,TArg>(Func<TResult,TArg> func, TArg arg); 

等等。當然,這確實會限制您可以支持的參數數量,但也許這對您仍然適用。

0

根據您的期望和僞代碼,你可以做這樣的事情。

public void SomeMethod(params object[] objects) { 
} 

public void SomeMethod(out object returnValue, params object[] objects) { 
} 

此同時支持任何數量和任何類型的參數,並且可以返回一個值或不返回取決於客戶機選擇的過載的值。但是,我不得不說,這似乎像一個非常糟糕的主意,你會負責處理任何則傳遞作爲參數。

4

有包裝方法調用一種廣泛使用的方法:

public static class Recorder 
{ 
    // overload for any method, that returns value 
    public static T CallFunc(Func<T> func) 
    { 
    // other stuff here 
    return func(); 
    // other stuff here 
    } 

    // overload for any method, that returns void 
    public static CallFunc(Action action) 
    { 
    // other stuff here 
    action(); 
    // other stuff here 
    } 
} 

用法:

Recorder.CallFunc(() => someObj.SomeMethod(param1, param2)); 
+0

這看起來像我需要的東西。所以我認爲沒有一個完美的方法可以做到這一點,但有兩種方法可以覆蓋它也不錯! – ijjo 2012-08-08 04:19:41