using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace _22声明自定义事件Eg2_简略的事件声明方式_代码
{
class Program
{
static void Main(string[] args)
{
Console.ReadLine();
Customer customer = new Customer(); //事件的拥有者是customer
Waiter waiter = new Waiter(); //事件的拥有者是waiter
customer.Order += waiter.Action; //事件Order ,事件订阅+=,事件处理器 waiter.Action
//customer.Action();
OrderEventArgs e = new OrderEventArgs();
e.DishName = "Manhanquanxi";
e.Siaze = "large";
OrderEventArgs e2 = new OrderEventArgs();
e2.DishName = "Beer";
e2.Siaze = "large";
Customer badGuy = new Customer();
badGuy.Order += waiter.Action;
badGuy.Order.Invoke(customer, e);
badGuy.Order.Invoke(customer, e2);
customer.PayTheBill();
}
}
public class OrderEventArgs : EventArgs /*用来传递事件信息,事件信息的术语是“EventArgs”,所以说这个类的名字以事件的名字加上EventArgs这个后缀。
这个事件的名字是Order,所以再加上后缀,最终这个类名为OrderEventArgs这是用来传递事件消息的类*/
{
public string DishName { get; set; }
public string Siaze { get; set; }
}
public delegate void OrderEventHandler(Customer customer, OrderEventArgs e); /*按照.Net的规定,如果委托是为声明某个事件而准备的,
那么这个委托的名字应该使用EventHandler作为后缀。*/
public class Customer
{
public OrderEventHandler Order; //简略版委托字段,删除了event
public double Bill { get; set; } //属性声明
public void PayTheBill()
{
Console.WriteLine("I will pay ${0}.", this.Bill);
}
public void WalkIn()
{
Console.WriteLine("Walk into the restaurant.");
}
public void SitDown()
{
Console.WriteLine("Sit Down.");
}
public void Think()
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine("Let me think ...");
Thread.Sleep(1000);
}
if (this.Order != null)
{
OrderEventArgs e = new OrderEventArgs();
e.DishName = "Kongpao Chicken";
e.Siaze = "large";
this.Order.Invoke(this, e);
}
}
public void Action()
{
Console.ReadLine();
this.WalkIn();
this.SitDown();
this.Think();
}
}
public class Waiter
{
public void Action(Customer customer, OrderEventArgs e)
{
Console.WriteLine("I will see you the dish-{0}.", e.DishName);
double price = 10;
switch (e.Siaze)
{
case "samll":
price = price * 0.5;
break;
case "large":
price = price * 1.5;
break;
default:
break;
}
customer.Bill += price;
}
}
}