c# – 多播委托和事件

我正在研究代表们.几天前,我为多播代表做了一个示例,并在这里查看了 My previous question,并清楚地了解了多播委托.

但现在我尝试用事件做多播委托样本.但在做样品时我有些疑惑.在上面的链接中,我在一个类中完成了所有函数和委托声明,并将函数添加到委托使用=并只调用委托.因此调用委托内的所有函数.

但现在我在两个不同的类中进行,并尝试在事件的帮助下完成所有功能.我在下面提供我目前的代码.

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        Arithmeticoperations aOperations = new Arithmeticoperations();
        aOperations.StartCalculations += new Arithmeticoperations.BasicCalculations(aOperations_StartCalculations);
        aOperations.PerformCalculations(20,10);
    }

    void aOperations_StartCalculations(string msg)
    {
        MessageBox.Show(msg);
    }
}


class Arithmeticoperations
{
    public delegate void BasicCalculations(string msg);

    public event BasicCalculations StartCalculations;


    public void PerformCalculations(int n1,int n2)
    {
        StartCalculations("Operation Success");
    }

    void Add(int num1,int num2)
    {
        MessageBox.Show("Performing addition.");
    }

    void Sub(int num1,int num2)
    {
        MessageBox.Show("Performing substraction.");
    }

    void Mul(int num1,int num2)
    {
        MessageBox.Show("Performing multiplication.");
    }

    void Div(int num1,int num2)
    {
        MessageBox.Show("Performing division.");
    }

}

这里的Form1是我的主类,Arithmeticoperations类用于执行功能.在这个声明上

aOperations.PerformCalculations(20,10);

在Form1中,将执行Arithmeticoperations类中的PerformCalculation()函数.

但我怀疑的是如何将所有Add,Sub,Mul和Div函数注册到Arithmeticoperations类中的委托,通过调用委托对象并将“Operation Success”返回到Form1类中的事件回调函数调用所有函数

解决方法

由于BasicCalculations采用string类型的单个参数,因此不能用于直接调用方法Add,Subtract等.

如果您希望PerformCalculations通过多播调用您的每个方法,您将需要一个等同于Action< int,int>的类型的委托,例如:

class Arithmeticoperations
{
    public delegate void BasicCalculations(string msg);

    public event BasicCalculations StartCalculations;

    private Action<int,int> calculations;

    public Arithmeticoperations()
    {
        this.calculations += this.Add;
        this.calculations += this.Sub;
    }

    public void PerformCalculations(int n1,int n2)
    {
        this.calculations.Invoke(n1,n2);
        StartCalculations("Operation Success");
    }

    // ...
}

如果您希望您的个别算术方法使用字符串调用StartCalculations事件,您可以让他们这样做:

void Add(int num1,int num2)
{
    StartCalculations("Performing addition.");
}

在引发事件时,您应该首先测试是否有订阅者(以避免NullReferenceException). standard pattern将获得任何处理程序订阅,测试null然后调用处理程序.如果在测试事件为null之后有人取消订阅,这将避免遇到NullReferenceException:

void Add(int num1,int num2)
{
    var handler = this.StartCalculations;
    if (handler != null)
    {
        handler("Performing addition.");
    }
}

由于每个方法会重复大量代码,因此可以将其重构为单独的方法

void Add(int num1,int num2)
{
    this.OnStartCalculation("Performing addition.");
}

void OnStartCalculation(string message)
{
    var handler = this.StartCalculations;
    if (handler != null)
    {
        handler(message);
    }
}

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...