-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathWeakEvent.cs
38 lines (35 loc) · 918 Bytes
/
WeakEvent.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
namespace WeakEvents;
public class WeakEvent<T>
where T : EventArgs
{
private readonly List<WeakReference<EventHandler<T>>> _handlers = [];
public void AddHandler(EventHandler<T> handler)
{
_handlers.Add(new WeakReference<EventHandler<T>>(handler));
}
public void RemoveHandler(EventHandler<T> handler)
{
_handlers.RemoveAll(wr =>
{
if (wr.TryGetTarget(out var target))
{
return target == handler;
}
return false;
});
}
public void RaiseEvent(object sender, T args)
{
foreach (var weakReference in _handlers.ToList())
{
if (weakReference.TryGetTarget(out var handler))
{
handler(sender, args);
}
else
{
_handlers.Remove(weakReference);
}
}
}
}