弱引用事件WeakEventManager的代码参考
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
namespace ConsoleApp1
{
internal class Program
{
static void Main(string[] args)
{
Seller seller = new Seller();
Buyer buyer = new Buyer();
Buyer1 buyer1 = new Buyer1();
CustomedWeakEventManager.AddListener(seller, buyer);
CustomedWeakEventManager.AddListener(seller, buyer1);
seller.Work();
Console.ReadLine();
}
}
public class CustomedEventArgs : EventArgs
{
public string Computer { get; set; }
public string Phone { get; set; }
}
public class Seller
{
public event EventHandler<CustomedEventArgs> CustomedEvent;
public void Work()
{
CustomedEvent?.Invoke(this, new CustomedEventArgs() { Computer = "Lenovo", Phone = "Lenovo" });
}
}
public class Buyer : IWeakEventListener
{
bool IWeakEventListener.ReceiveWeakEvent(Type managerType, object source, EventArgs e)
{
CustomedEventArgs args = (CustomedEventArgs)e;
Console.WriteLine("CustomerA buys a {0} computer and a {1} phone.", args.Computer, args.Phone);
return true;
}
}
public class Buyer1 : IWeakEventListener
{
bool IWeakEventListener.ReceiveWeakEvent(Type managerType, object source, EventArgs e)
{
CustomedEventArgs args = (CustomedEventArgs)e;
Console.WriteLine("CustomerB buys a {0} computer and a {1} phone.", args.Computer, args.Phone);
return true;
}
}
public class CustomedWeakEventManager : WeakEventManager
{
//将提供的侦听器添加到为托管事件所提供的源中
public static void AddListener(object source, IWeakEventListener listener)
{
CurrentManager.ProtectedAddListener(source, listener);
}
public static void RemoveListener(object source, IWeakEventListener listener)
{
CurrentManager.ProtectedRemoveListener(source, listener);
}
//返回用于所提供类型的 WeakEventManager 实现
public static CustomedWeakEventManager CurrentManager
{
get
{
CustomedWeakEventManager manager = GetCurrentManager(typeof(CustomedWeakEventManager)) as CustomedWeakEventManager;
if (manager == null)
{
manager = new CustomedWeakEventManager();
SetCurrentManager(typeof(CustomedWeakEventManager), manager);
}
return manager;
}
}
protected override void StartListening(object source)
{
(source as Seller).CustomedEvent += RegisterEvent;
}
protected override void StopListening(object source)
{
(source as Seller).CustomedEvent -= RegisterEvent;
}
//将正在托管的事件传送到每个侦听器。
public void RegisterEvent(object sender, CustomedEventArgs e)
{
DeliverEvent(sender, e);
}
}
}