Событие конструктора C # - PullRequest
2 голосов
/ 23 ноября 2011

я создал класс, и когда я создаю объект сотрудника через форму, я хочу дать сообщение;

это мой класс, мероприятие и делегат

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");
        }

Ответы [ 6 ]

7 голосов
/ 23 ноября 2011

Вы присоединяете событие после , конструктор уже запущен.

6 голосов
/ 23 ноября 2011

Чего ты пытаешься достичь?Причина того, что вы попробовали, не работает, потому что вы прикрепляете своего делегата после 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;
  }
}

Подпишитесь на событие класса фабрики, и вы получите событие.

1 голос
/ 23 ноября 2011

Не имеет смысла вызывать событие экземпляра в конструкторе, поскольку, поскольку инициализация экземпляра еще не завершена, к событию не может быть прикреплен какой-либо обработчик ...

Однако вы можете создать статическое событие:

public static event ctorDel myEvent;

...

Employee.myEvent += new ctorDel(showMessage);

(но не подписывайтесь на событие каждый раз, когда вы создаете Employee, иначе обработчик будет вызываться столько раз, сколько существует экземпляров...)

0 голосов
/ 07 января 2019

Решение

Вот общий подход к вашей проблеме

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;
}
0 голосов
/ 23 ноября 2011

К моменту подписки на это событие экземпляр уже создан. Я бы порекомендовал использовать шаблон 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);  
0 голосов
/ 23 ноября 2011

Вы можете передать обработчик при создании 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...