2014-02-20 24 views
1

我在這種情況下,我想有一種方法,可以採取其他方法作爲輸入。使用行動<object>作爲方法輸入

輸入法始終只有一個對象作爲輸入,但對象不同。

這或多或少是什麼,我需要能夠做到:

public static void takeAnything(Action<object> inputFunc) 
{ 
    Console.WriteLine(inputFunc.Method.Name); 
} 

public static void test1(MyOwnObject input){ 
    // Do stuff with input object 
} 

public static void test2(MyOtherOwnObject input){ 
    // Do stuff with input object 
} 

public static void startSystem(){ 
    takeAnything(test1); 
    takeAnything(test2); 
} 

在這種情況下,假人會寫出來:

test1 
test2 

我只是cant't得到這個工作,所以任何幫助將非常感激。

編輯

我不知道這是可能的,也許不是,但重要的是,通話只是takeAnything(test1),不takeAnything<MyOwnObject>(test1)或其他任何東西。

+3

你究竟在問什麼?你有沒有奉獻'TakeAnything'成一個通用的方法(即'TakeAnything (Action inputFunc')? – Chris

+0

我試過了,但我只能讓它工作調用它:takeAnything (測試),如果我刪除部分我得到這個錯誤:方法'takeAnything (System.Action )'的類型參數不能從使用推斷。嘗試明確指定類型參數。 我不知道這是甚至可能的,這是我希望你們能幫我弄清楚:) – Bjarkes

回答

5

讓你的方法一般

public static void TakeAnything<T>(Action<T> inputFunc) 
{ 
    Console.WriteLine(inputFunc.Method.Name); 
} 

當然,你將只能通過這些具有單輸入參數的方法。

更新:不幸的是C#不能從使用推斷動作泛型參數類型,當你路過法團的方法,所以只有這樣,才能用它指定泛型參數類型手動

takeAnything<MyOwnObject>(test) 

詳見問題C# 3.0 generic type inference - passing a delegate as a function parameter

0

試試這個,所以你可以通過動態參數動作:

public static void takeAnything(Expression<Action> inputFunc) 
{ 
    var currentMethod = ((MethodCallExpression)inputFunc.Body); 
    Console.WriteLine(currentMethod.Method.Name); 
} 

public static void test(MyOwnObject input){ 
    // Do stuff with input object 
} 

public static void startSystem(){ 
    MyOwnObject yourObject = new MyOwnObject(); 
    takeAnything(() => test(yourObject)); 
} 
+1

-1,你甚至嘗試運行這個代碼嗎?你如何看待lambda將在代表中表示?不,它不會神奇地消失,因此'Method.Name'可以解析爲''test''。 –

+0

對不起,我編輯了我的答案 –

+1

似乎現在工作(與錯誤更正,在'takeAnything'中的參數名稱不匹配在第一行中使用('action'與'inputFun') – Chris

-1

爲什麼不改變頭呃你的takeAnything方法爲:

public static void takeAnything(Action<MyOwnObject> inputFunc) 
+2

因爲takeAnything方法將使用許多不同的輸入方法調用,具有不同的輸入對象。 – Bjarkes