using System; #if NETSTANDARD1_3 using System.Reflection; #endif namespace Unosquare.Swan.Components { /// /// Represents an active subscription to a message. /// public sealed class MessageHubSubscriptionToken : IDisposable { private readonly WeakReference _hub; private readonly Type _messageType; /// /// Initializes a new instance of the class. /// /// The hub. /// Type of the message. /// hub. /// messageType. public MessageHubSubscriptionToken(IMessageHub hub, Type messageType) { if(hub == null) { throw new ArgumentNullException(nameof(hub)); } if(!typeof(IMessageHubMessage).IsAssignableFrom(messageType)) { throw new ArgumentOutOfRangeException(nameof(messageType)); } this._hub = new WeakReference(hub); this._messageType = messageType; } /// public void Dispose() { if(this._hub.IsAlive && this._hub.Target is IMessageHub hub) { System.Reflection.MethodInfo unsubscribeMethod = typeof(IMessageHub).GetMethod(nameof(IMessageHub.Unsubscribe), new[] { typeof(MessageHubSubscriptionToken) }); unsubscribeMethod = unsubscribeMethod.MakeGenericMethod(this._messageType); _ = unsubscribeMethod.Invoke(hub, new Object[] { this }); } GC.SuppressFinalize(this); } } }