C#带有参数的事件订阅

Author Avatar
幽浮404 2018年07月16日
  • 在其它设备中阅读本文章

首先定义一个传递参数的类,可以是 EventArgs 类的派生类(继承该类),也可以是 string、int 这种简单类,或者是其他自定义类型
这里定义一个 CryEventArgs 类传递参数

class CryEventArgs:EventArgs
{
    //存储一个字符串  
    public string CatName
    {
        get;
        set;
    }
}

接下来设计 Cat 类和 Mouse 类

class Cat
{
    string cName;
    public event mcEventHandler CatCryEvent;
    //定义带有参数的事件,此处CryEventArgs可以为其他简单类,如是,下面订阅的函数的签名需要相应地改变
    public event EventHandler<CryEventArgs> CatCryEvent1;
    public Cat(string name)
    {
        cName = name;
    }

    public void Cry()
    {
        Console.WriteLine(cName+"来了");
        Console.ReadLine();
        //用这个保存参数
        CryEventArgs e = new CryEventArgs();
        e.CatName = cName;
        //触发事件
        //CatCryEvent();
        CatCryEvent1(this, e);
    }
}

class Mouse
{
    public Mouse(Cat cat)
    {
        //订阅事件的两种形式
        //cat.CatCryEvent1 += Run;
        cat.CatCryEvent1 += new EventHandler<CryEventArgs>(Run);
    }

    private void Run(object sender,CryEventArgs e)
    {
        if(e.CatName=="Tom")
        {
            Console.WriteLine("别怕,是Tom这只傻猫");
            Console.ReadLine();
        }
        else
        {
            Console.WriteLine("快跑啊,是其他猫!");
            Console.ReadLine();
        }
    }
}

//主函数,模拟事件发生
public static void Main()
{
     Cat c1 = new Cat("Tom");
     Cat c2 = new Cat("Ben");
     //两只老鼠,分别见到两只猫
     Mouse m = new Mouse(c1);
     Mouse m2 = new Mouse(c2);
     c1.Cry();
     Console.WriteLine("//-----------------而另一边---------------------//");
     c2.Cry();
}

结果如下图
20170505154640495.png

转自 loveyou388i 的博客 仅作为记录