2010-12-21 74 views
1

我需要傳遞一個委託和委託應該調用的方法名稱作爲類構造函數的參數我該怎麼做?使用通用委託在不同的類中調用多個方法

也就是說,如果

public delegate object CCommonDelegate(); 

是我的委託,並說,它可以調用下面這個簽名

string Method1(); 

object Method2(); 

class X 
{ 
    public X(CCommonDelegate,"MethodName to invoke"){} //how to pass the Method name here.. 

} 

PS任何方法:忽略訪問修飾符

回答

4

委託是持有變量可以調用的東西。如果X是需要能夠調用的東西類,那麼它所需要的是委託:

public delegate object CommonDelegate(); 

class X 
{ 
    CommonDelegate d; 

    public X(CommonDelegate d) 
    { 
     this.d = d; // store the delegate for later 
    } 
} 

後來,它可以調用委託:

var o = d(); 

順便說一句,你不」不需要定義這樣的代表。 Func<Object>類型已經存在,並且具有正確的結構。

構建X給出你的兩個實例方法:

string Method1() 
object Method2() 

可以說

var x = new X(obj.Method2); 

哪裏obj是具有Method2的類的對象。在C#4中,您可以對Method1執行相同的操作。但在3你需要使用拉姆達轉換:

var x = new X(() => obj.Method1); 

這是因爲返回類型不完全相同:它通過繼承相關。這隻會在C#4中自動運行,並且只有在您使用Func<object>時纔會生效。

+0

我將能夠使用這張異步調用? – 2010-12-21 15:37:42

+0

你可以在任何委託上啓動BeginInvoke來啓動它在線程池上的執行。你是否應該是另一回事! http://msdn.microsoft.com/en-us/library/2e08f6yc.aspx – 2010-12-21 15:44:30

2

爲什麼不只是有你的構造採取Func< object>

public class x 
{ 
    public x(Func<object> func) 
    { 
      object obj = func(); 
    } 
} 

然後

x myX = new x(()=> "test"); 
相關問題