namespace Unosquare.Swan.Components { using System; #if NETSTANDARD1_3 using System.Reflection; #endif /// /// 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)); } _hub = new WeakReference(hub); _messageType = messageType; } /// public void Dispose() { if (_hub.IsAlive && _hub.Target is IMessageHub hub) { var unsubscribeMethod = typeof(IMessageHub).GetMethod(nameof(IMessageHub.Unsubscribe), new[] {typeof(MessageHubSubscriptionToken)}); unsubscribeMethod = unsubscribeMethod.MakeGenericMethod(_messageType); unsubscribeMethod.Invoke(hub, new object[] {this}); } GC.SuppressFinalize(this); } } }