2010-01-17 28 views
1

我試圖從Django(http://docs.djangoproject.com/en/dev/topics/signals/),或其概念在C#中實現的信號,以減少/消除耦合/方法的依賴關係。我如何實現信號(從Django)概念在C#

到目前爲止,我正在複製代碼,直到我意識到方法不是C#中的對象,因爲它在Python中。然後我想到了指針,然後我意識到我不能指向方法。它的C#版本是代表。

然後我意識到委託人有一個獨特的簽名,所以我不能真正混合委託方法(與diff簽名)到一個列表,或者我可以嗎?

我做了更多的搜索,並找到了反應性LINQ,到目前爲止,linq看起來很棒,但我仍然沒有真正瞭解何時使用它們。

所以我的問題是,你將如何在C#中實現信號的概念?謝謝!

哦,我提到我是新的(1天)到C#?我確實有各種其他語言的背景,包括Java/C/Python。

乾杯:)

+5

您是否熟悉C#的「events」概念?我認爲這將完成你想要的東西,而且它是本地語言。 :) http://msdn.microsoft.com/en-us/library/aa645739(VS.71).aspx – Sapph 2010-01-17 09:25:28

+0

同意上面Sapph的評論。查看構建自EventArgs派生的自定義類,以便將不同類型的數據從發件人傳輸到接收方(如示例代碼中所示):http://msdn.microsoft.com/en-us/library/system.eventargs(VS .85).aspx – BillW 2010-01-17 09:39:44

+0

也想一想:http://msdn.microsoft.com/en-us/library/w369ty8x.aspx「如何發佈事件」是一篇非常有用的文章,向您展示了使用定義事件的通用和非通用方法。 – BillW 2010-01-17 10:31:18

回答

2

你在說什麼這裏是在C#中的事件,例如通常的處理;

public class SomeType { 
    public event EventHandler SomeEvent; 
    protected virtual void OnSomeEvent() { 
     EventHandler handler = SomeEvent; 
     if(handler!=null) handler(this,EventArgs.Empty); 
    } 
    public void SomethingInteresting() { 
     // blah 
     OnSomeEvent(); // notify subscribers 
     // blap 
    } 
    // ... 
} 

隨着用戶...

SomeType obj = new SomeType(); 
//... 
obj.SomeEvent += /* some handler */ 
//... 

處理程序可能是一個方法,但在你的簽名等,再使用具有不匹配的簽名,與現有方法的常用方法的討論匿名方法:

obj.SomeEvent += delegate { this.Text = "Done!"; }; 

可以有委託列表:

List<SomeDelegateType> list = new List<SomeDelegateType>(); 
list.Add(...); 

但由於委託實例是組播這可能是多餘的 - 這樣你就可以做到這一點更直接:

Action action = null; 
action += delegate { Console.WriteLine("Did A");}; 
action += delegate { Console.WriteLine("Did B");}; 
action(); // does both A & B 

需要注意的是更爲複雜的委託使用率可能involv傳入的參數值 - 例如:

int i = 24; 
Func<int,int,int> func = (x,y) => (x * i) + y; 
int result = func(2, 3); // 51 

通過將諸如匿名方法(或lambda,如上所述)與諸如捕獲變量之類的東西結合起來,簽名必須匹配的問題很少成爲問題 - 您可以用一個包裝lambda進行簽名匹配(根據需要添加額外的值或刪除參數)。

注意與事件(具體地)常用的方法是保持簽名:

void SomeDelegateType(object sender, SomeArgsType args); 

其中SomeArgsType : EventArgs - 或使用EventHandler<T>這會爲你做到這一點。

+0

這是一個很好的答案! – 2016-12-31 09:12:14