2011-11-23 70 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);