2013-03-14 58 views
4

調用我有對象var channel = new Chanel(); 這個對象有幾種方法我稱之爲內部功能是這樣的:通行證方法和內部功能

private bool GetMethodExecution() 
{ 
    var channel = new Channel(); 
    channel.method1(); 
    channel.method2(); 
} 

Channel類的所有方法從接口IChannel派生。 我的問題是我怎麼可以調用方法GetMethodExecution()並通過哪個方法我想執行,然後在此函數內部根據傳遞的參數執行它。

我需要的是調用GetMethodExecution(IChannle.method1),然後在該函數內的對象上調用它。這是可能的

+2

什麼是較大的上下文?你爲什麼確定'反射'是最好的選擇?爲什麼不根據應用程序狀態分別調用方法? – Leri 2013-03-14 12:41:04

+0

老實說,我認爲Action或Func可能在這裏有幫助,但不知道如何使用它。 – kosnkov 2013-03-14 12:45:25

+0

基於什麼樣的參數傳遞?你想傳遞你想要調用的方法名嗎? – 2013-03-14 12:47:26

回答

4
private bool GetMethodExecution(Func<Channel, bool> channelExecutor) 
{ 
    var channel = new Channel(); 
    return channelExecutor(channel); 
} 

現在,你可以通過拉姆達像傳遞方法:

GetMethodExecution(ch => ch.method1()); 

GetMethodExecution(ch => ch.method2()); 
+0

好的,但我想調用GetMethodExecution內的所有這些方法,並且這些方法不需要任何參數,我需要的是調用GetMethodExecution(IChannle.method1)這是可能的嗎? – kosnkov 2013-03-14 12:47:34

1

您正在尋找這樣的事情?

private bool GetMethodExecution(int method) 
{ 
    switch (method) 
    { 
     case 1: return new Channel().method1(); 
     case 2: return new Channel().method2(); 
     default: throw new ArgumentOutOfRangeException("method"); 
    } 
} 
GetMethodExecution(1); 
GetMethodExecution(2); 
+0

更多的Func,但方法沒有檔次 – kosnkov 2013-03-14 12:43:23

+0

'GetMethodExecution(1);'不清楚哪個方法將被執行。考慮方法調用Move(3)'和Move(player => player.Left())' – 2013-03-14 12:46:20

1

你可以做到這一點爲使用Func代表如下:

private bool GetMethodExecution(Func<bool> Method) 
{ 
    return Method() 
} 

public bool YourCallingMethod() 
{ 
    var channel = new Channel();   
    return GetMethodExecution(channel.method1); // Or return GetMethodExecution(channel.method2); 
} 
+0

之間的區別,這幾乎是答案,但在這種情況下,我需要在GetMethodExecution之外創建對象,然後傳遞它的方法,但是這個對象是我知道的接口,所以我想傳遞最少的信息,比如調用接口的哪個方法,然後在這個方法中繼續調用和創建。 – kosnkov 2013-03-14 13:00:47

+0

語法不太正確;你調用'method1'不會傳遞它。您需要刪除方法名稱後傳遞代理的parens。 – Servy 2013-03-14 13:48:18

0

如果你想通過方法名作爲參數調用它的代碼塊中,你可以使用反射如下:

private bool GetMethodExecution(string methodName) 
{ 
    var channel = new Channel(); 

    Type type = typeof(Channel); 
    MethodInfo info = type.GetMethod(methodName); 

    return (bool)info.Invoke(channel, null); // # Assuming the methods you call return bool 
}