2011-11-23 165 views
3

我創建了一個類,當我通過窗體創建一個員工對象時,我想給一個消息;C#構造函數事件

這是我的課,事件和委託

public delegate void ctorDel(); 

class Employee 
{ 
    private int empID; 
    private string empName; 

    public event ctorDel myEvent; 

    public Employee(int empID,string empName) 
    { 
     this.empID = empID; 
     this.empName = empName; 

     **if (myEvent != null) 
     { 
      myEvent(); 
     }** 
    } 

和形式

int id = Convert.ToInt16(textBox1.Text); 
      string name = textBox2.Text; 

      Employee emp = new Employee(id, name); 
      emp.myEvent += new ctorDel(showMessage); 

和功能

public void showMessage() 
     { 
      MessageBox.Show("An employee is created"); 
     } 
+2

你是什麼問題呢?你有什麼問題? – Oded

+0

什麼是問題? – ElDog

+0

myEvent永遠不會被解僱,因爲它沒有被設置在任何地方。 – Krzysztof

回答

6

什麼是你要完成它?你嘗試過的原因不起作用,因爲你是在委託人後面附上委託人。一旦你打電話給「新員工」,這個事件就會被解僱。

如果你真的需要這樣的活動,創建一個工廠類:

public delegate void EmpCreated(); 
public EmployeeFactory { 
    public event EmpCreated myEvent; 
    public Employee Create(int empId, string empName){ 
    var result = new Employee(empId, empName); 
    if(myEvent != null) myEvent(); 
    return result; 
    } 
} 

訂閱的工廠類的事件,你會得到該事件。

+0

我可以在員工構造函數中執行此操作嗎? – snnlankrdsm

7

你安裝時後的構造函數已經運行。

1

它沒有意義在構造函數中引發一個實例事件,因爲自從實例的初始化還沒有完成,不能有附加到事件的任何處理......

然而,你可以創建一個靜態事件:

public static event ctorDel myEvent; 

... 

Employee.myEvent += new ctorDel(showMessage); 

(但每次創建一個Employee時間不認同的情況下,或存在這樣的情況的處理程序將被調用多次...)

0

您可以在創建時傳遞處理函數荷蘭國際集團的員工:

private Employee(ctorDel construcEvent) 
{ 
    if (construcEvent != null) 
     this.myEvent += construcEvent; 
} 

public Employee(int empID,string empName, ctorDel construcEvent) 
    : this(construcEvent) 
{ 
    this.empID = empID; 
    this.empName = empName; 

    if (myEvent != null) 
    { 
     myEvent(); 
    } 
} 

然後:

Employee emp = new Employee(id, name, new ctorDel(showMessage)); 
0

當您訂閱此事件時,實例已經構建。 我會建議使用工廠模式來隱藏構造函數。

class EmployeeFactory 
{ 
    public Employee Create(int id, string name) 
    { 
     Employee instance = new Employee(id, name); 

     var handler = EmployeeCreated; 
     if (handler != null) 
     { 
       EmployeeEventArgs e = new EmployeeEventArgs(instance); 
       handler(e);  
     } 

     return instance; 
    } 

    public event EventHandler<EmployeeEventArgs> EmployeeCreated; 
} 

事件訂閱:

factory.EmployeeCreated += MyHandler; 

實例建設:

var emp = factory.Create(id, name);