C#事件の.net下的EventArgs和EventHandler

时间:2023-03-09 12:52:22
C#事件の.net下的EventArgs和EventHandler

事件参数(EventArgs)

.Net框架里边提供的一个委托EventHandler来Handle事件。

一样,搞一个场景(这个场景是书里的):买车。经销商(CarDealer)会上新车(NewCar)事件,这个事件会由买车的顾客(Comsumer)订阅,一旦有新车出来他们就会来光顾。在这里,由于需要详细的车的信息,所以使用前面提到的不带参数的方法就比较麻烦,我们重新定义一个委托(delegate)和事件参数(EventArgs)。

1、事件参数(CarInfoEventArgs)

从.Net提供的EventArgs里派生出来,包含车辆名字的属性

C#事件の.net下的EventArgs和EventHandler
public class CarInfoEventArgs : EventArgs
{
public string Car { get; private set; } public CarInfoEventArgs(string car)
{
this.Car = car;
}
}
C#事件の.net下的EventArgs和EventHandler

2、事件(NewCarInfo)

这里使用.Net自带的委托EventHandler来声明一个事件,相应的,这个事件的处理程序就必须使用这个委托对应的参数来构建

public event EventHandler<CarInfoEventArgs> NewCarInfo;

注意,这是一个泛型委托,在这里指定了参数的类型为CarInfoEventArgs,EventHandler的定义如下:

public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e)
where TEventArgs : EventArgs

可以看到这个委托包含两个参数:一个object类型,一个泛型参数,并且这个泛型参数被限制为EventArgs或EventArgs派生的类型

3、完整的对象

CarDealer

C#事件の.net下的EventArgs和EventHandler
public class CarDealer
{
public event EventHandler<CarInfoEventArgs> NewCarInfo; // 触发事件
public void NewCar(string car)
{
Console.WriteLine($"CarDealer, new car {car}");
if (NewCarInfo != null)
{
NewCarInfo(this, new CarInfoEventArgs(car));
}
}
}
C#事件の.net下的EventArgs和EventHandler

Consumer

C#事件の.net下的EventArgs和EventHandler
public class Consumer
{
public string Name { get; private set; } public Consumer(string name)
{
this.Name = name;
} public void NewCarIsHere(object sender, CarInfoEventArgs e)
{
Console.WriteLine($"{name}: car {e.Car} is new");
}
}
C#事件の.net下的EventArgs和EventHandler

4、具体的实现

C#事件の.net下的EventArgs和EventHandler
public class Program
{
static void Main()
{
var dealer = new CarDealer(); var michael = new Consumer("Michael");
dealer.NewCarInfo += michael.NewCarIsHere; dealer.NewCar("Mercedes"); var nick = new Consumer("Nick");
dealer.NewCarInfo += nick.NewCarIsHere; dealer.NewCar("Ferrari"); dealer.NewCarInfo -= michael.NewCarIsHere;
dealer.NewCar("Toyota");
}
}

相关文章