2010-06-10 23 views
1

是否有可能像這個函數「F」帶有顯式「this」指針的代表?

class C { 
    public void F(int i); 
} 

的方法適應像Action<C,int>委託?

我有這樣的模糊回憶,微軟正在努力支持這種適應。但也許我誤解了!

編輯:我知道這並不在VS2008編譯:

class C { 
    public void F(int i); 
    void G() { 
     Action<C, int> test = this.F; 
    } 
} 

我只是想知道如果MS提供了一種在BCL要做到這一點,或者如果該功能將被添加在未來的版本。

+0

你希望通過這個獲得什麼?它會做什麼'var test = new Action (this.F)'不能? – zildjohn01 2010-06-10 23:33:23

+0

區別在於,每次調用委託時都可以更改類C的實例。 – Qwertie 2010-06-10 23:59:30

+0

下面是一個關於公開代表的好博客文章:http://www.simple-talk.com/community/blogs/simonc/archive/2010/07/28/93676.aspx – Qwertie 2011-04-12 01:22:36

回答

2

最簡單的方法可能是創建一個lambda這需要一個Cint,並在C呼籲F,經過int

Action<C, int> test = (c, v) => c.F(v); 

您還可以創建所謂的一個開放代表到實例方法C.F,而不是通常類型的「關閉它的實例參數」的委託。這將使用反射和Delegate.CreateDelegate方法完成。雖然這會導致更直接的代表,但它可能比您需要的更復雜。

+0

這個「公開代表」正是我想要的。 lambda解決方案並不錯,但理論上應該會更慢,並且我希望獲得最高性能(我在運行時生成代碼,因此避免反射的複雜性無論如何都是不可能的)。由於這個問題很長時間沒有得到解答,我最終採取了一種與我最初設想的不同的方法。 – Qwertie 2010-09-09 19:10:43