我创建了一个类,当我通过表单创建一个员工对象时,我想给出一条消息;
这是我的班级,活动和代表
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");
}
答案 0 :(得分:7)
在构造函数已经运行之后,您正在附加事件。
答案 1 :(得分:6)
你想要完成的是什么?您尝试过的原因不起作用是因为您在ctor之后附加了您的代表。一旦你打电话给“新员工”,事件就会被解雇。
如果您确实需要这样的活动,请创建工厂类:
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;
}
}
订阅工厂类的活动,您将获得活动。
答案 2 :(得分:1)
在构造函数中引发实例事件是没有意义的,因为实例的初始化尚未完成,所以事件中不能附加任何处理程序......
但是,您可以创建一个静态事件:
public static event ctorDel myEvent;
...
Employee.myEvent += new ctorDel(showMessage);
(但是每次创建Employee
时都不会订阅该事件,或者会像实例一样多次调用处理程序...)
答案 3 :(得分:0)
您可以在创建Employee时传递处理程序:
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));
答案 4 :(得分:0)
当您订阅此事件时,实例已经构建完毕。 我建议使用Factory模式来隐藏构造函数。
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);
答案 5 :(得分:0)
这是解决问题的通用方法
public class EventFactory
{
public U Create<U, V>(V constructorArgs)
{
var instance = (U)Activator.CreateInstance(typeof(U), constructorArgs);
OnCreated?.Invoke();
return instance;
}
public delegate void CreatedEventHandler();
public event CreatedEventHandler OnCreated;
}
然后您可以做
var ef = new EventFactory();
ef.OnCreated += myEventHandler;
var instance = ef.Create<Employee>(employeeArgs);
当您需要传递事件参数或构造函数为无参数时,可以调整我的代码以提供更大的灵活性。我还没有测试过,但是应该看起来像
public class EventFactory<T>
{
public U Create<U, V>(V constructorArgs, T eventArgs)
{
var instance = (U)Activator.CreateInstance(typeof(U), constructorArgs);
OnCreated?.Invoke(eventArgs);
return instance;
}
public U Create<U>(T eventArgs)
{
return Create<U, object>(null, eventArgs);
}
public delegate void CreatedEventHandler(T args);
public event CreatedEventHandler OnCreated;
}
public class EventFactory
{
public U Create<U, V>(V constructorArgs)
{
var instance = (U)Activator.CreateInstance(typeof(U), constructorArgs);
OnCreated?.Invoke();
return instance;
}
public U Create<U>() where U : new()
{
var instance = new U();
OnCreated?.Invoke();
return instance;
}
public delegate void CreatedEventHandler();
public event CreatedEventHandler OnCreated;
}