2015-03-25 75 views
1

我完全新的事件在C#中,這就是我想做的事:如何在c#中使用事件?

我有兩種方法:

OpenPage1();  
OpenPage2(); 

當這些方法之一是所謂的,我想命名爲第三個方法PerformSomeTask()被調用。

我相信這可以通過事件處理完成。誰能告訴我如何做到這一點?

+0

爲什麼不能簡單地把成'PerformSomeTask()的調用'兩'OpenPage'methods?這就是說,[這是一個很好的答案](http://stackoverflow.com/questions/6201257/making-method-in-another-class-call-an-event-in-calling-class-when-its-done)在事件訂閱/通知 – 2015-03-25 09:38:18

回答

1

事件是C#的重要組成部分。

簡單來說,您首先需要一個委託人,它描述了調用方法的類型。在你的例子中,PerformSomeTask是無效的並且不帶任何參數。 所以,在你的類聲明

public delegate void PerformSomeTask(); 

然後,你需要聲明事件,這是將調用啓動您的功能

public event PerformSomeTask OnPerformSomeTask; 

在您的這兩種方法,OpenPage1和OpenPage2成員,你需要檢查是否有人訂閱你的活動,如果是,請致電。

if(OnPerformSomeTask != null) 
    OnPerformSomeTask(); 

這將啓動每一個訂閱您事件的方法。訂戶可以是多個。

要訂閱,只需像這樣做:

YourClass.OnPerformSomeTask += MyVoidMethod; 
[...] 
public void MyVoidMethod() { DoSomething(); [...] } 

你的無效方法將被稱爲每次您的運行OpenPage1和OpenPage2

如果你需要一些參數,中庸之道改變你的委託進行。然後,你的方法將這個參數作爲標準函數參數(用你的值調用你的事件,把它作爲參數傳遞給每個訂閱函數)。

+0

感謝您的快速和準確的答覆。幫助我按時完成任務:) – Rameshwar 2015-03-25 10:48:06

+0

不客氣;-) – cdie 2015-03-25 11:00:48

3

你所要做的只是添加一個正確的eventHandler事件(在你的例子中爲Action)。 eventHandler應該對應將訂閱此事件的方法。 然後你從openPage方法中激發事件。 如果沒有人訂閱此活動,您必須檢查null。

public class Foo 
{ 
    public event Action theEvent; 

    public void OpenPage1() 
    { 
     if (theEvent != null) 
      theEvent(); 
    } 

    public void OpenPage2() 
    { 
     if (theEvent != null) 
      theEvent(); 
    } 
} 

public class Bar 
{ 
    public int Counter { get; set; } 

    public void PerformSomeTask() 
    { 
     Counter++; 
    }   
} 

而這裏的,你可以運行,看到它一起測試:

[TestMethod] 
public void TestMethod1() 
{ 
    var foo = new Foo(); 
    var bar = new Bar(); 
    foo.theEvent += bar.PerformSomeTask; 

    foo.OpenPage1(); 
    foo.OpenPage2(); 

    Assert.AreEqual(2, bar.Counter); 
} 
相關問題