/// <summary>
/// 事件提供者
/// </summary>
public class EventProvider
{
//弱引用事件处理器
private WeakReference<EventHandler<EventArgs>> _event = new WeakReference<EventHandler<EventArgs>>(null);
public event EventHandler<EventArgs> Event
{
add
{
_event.Target += value;
}
remove
{
_event.Target -= value;
}
}
public void Notify(object sender, EventArgs e)
{
if (_event != null && _event.Target != null)
_event.Target(sender, e);
}
}
/// <summary>
/// 泛型WeakReference
/// </summary>
/// <typeparam name="T"></typeparam>
public class WeakReference<T> : WeakReference where T : class
{
public WeakReference() : base(null) { }
public WeakReference(T target) : base(target) { }
public WeakReference(T target, bool trackResurrection) : base(target, trackResurrection) { }
public WeakReference(SerializationInfo info, StreamingContext context) : base(info, context) { }
public new T Target
{
get
{
return base.Target as T;
}
set
{
base.Target = value;
}
}
public static implicit operator T(WeakReference<T> o)
{
if (o != null && o.Target != null)
return o.Target;
return null;
}
public static implicit operator WeakReference<T>(T target)
{
return new WeakReference<T>(target);
}
}
class App
{
private byte[] memory = new byte[10000000];
public void TestWeakDel(object sender, EventArgs args)
{
MessageBox.Show("TestWeakDel");
}
}
EventProvider ep = new EventProvider();
List<EventHandler<EventArgs>> list = new List<EventHandler<EventArgs>>();
App app = new App();
EventHandler<EventArgs> tmp = new EventHandler<EventArgs>(app.TestWeakDel);
ep.Event += tmp;
ep.Notify(app, EventArgs.Empty);
app = null;
GC.Collect();