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);
}
}
}