1

我有下面的代码声明了一个委托:

delegate void EmployeeSalaryCalculated(int idEmp);

我有这些简单的类:

    class Employee
    {
        public void CalculateSalary(int idEmp){}
    }

    class Payroll
    {
        public void EmpSalNotification(int idEmp) { }            

        public void SetMethod(ref EmployeeSalaryCalculated esc)
        {
            esc += this.EmpSalNotification;
        }         
    }

    class HR
    {
        public void EmpSalNotification(int idEmp) { }           

        public void SetMethod(ref EmployeeSalaryCalculated esc)
        {
            esc = this.EmpSalNotification;
        }
    }

下面的按钮处理程序利用了上面的类:

private void btnStart_Click(object sender, EventArgs e)
        {              
            Payroll payroll = new Payroll();
            HR hr = new HR();            

            EmployeeSalaryCalculated empSalCalculated = null;
            empSalCalculated += payroll.EmpSalNotification;
            empSalCalculated += hr.EmpSalNotification;

            // This invokes both methods - fine. 
            // empSalCalculated.GetInvocationList() returns 2
            empSalCalculated.Invoke(108);

            EmployeeSalaryCalculated empSalCalculated2 = null;
            payroll.SetMethod(ref empSalCalculated2);
            hr.SetMethod(ref empSalCalculated2);

            // This however, invokes only one method!
            // empSalCalculated2.GetInvocationList() returns 1
            empSalCalculated2.Invoke(108);    
        }

尽管通过empSalCalculated2ref 传递委托对象,但它只执行一个函数,这与empSalCalculated执行两个函数的委托对象不同。

有什么想法吗?

4

3 回答 3

2

问题出在这一行HR.SetMethod

esc = this.EmpSalNotification;

此行覆盖esc之前的任何值。SetMethod因此,给定您从对象调用的顺序,empSalCalculated2只包含来自HR实例的方法,该方法被执行。

要更正此问题,您可能需要重写HR.SetMethod

esc += this.EmpSalNotification;

SetMethod或颠倒调用顺序:

hr.SetMethod(ref empSalCalculated2);
payroll.SetMethod(ref empSalCalculated2);
于 2013-07-29T21:03:56.367 回答
1

我认为这是您的人力资源课程中的错字

class HR
    {
        public void EmpSalNotification(int idEmp) { }           

        public void SetMethod(ref EmployeeSalaryCalculated esc)
        {
            // this is =, not +=, so only one ref is held at a time
            esc = this.EmpSalNotification; 
        }
    }
于 2013-07-29T21:04:11.417 回答
1

只是代码中的一个错字:

esc += this.EmpSalNotification;  

对比

 esc = this.EmpSalNotification;  
于 2013-07-29T21:04:26.073 回答