using System;
using System.Collections.Generic;
public class Test
{
public static void Main()
{
// your code goes here
Messenger m = new Messenger();
var sum = 0;
Action<int> messenger = x => sum += x;
m.Register<int>(messenger);
m.Send(42);
Console.WriteLine(sum);
m.Unregister<int>(messenger);
m.Send(23);
Console.WriteLine(sum);
}
}
/// <summary>
/// Strongly-typed messenger system.
/// </summary>
public class Messenger
{
/// <summary>
/// The actions. These are called when a message is sent.
/// </summary>
private readonly IDictionary<Type, Delegate> actions = new Dictionary<Type, Delegate>();
/// <summary>
/// Register an action for a message.
/// </summary>
/// <typeparam name="T"> Type of message to receive. </typeparam>
/// <param name="action"> The action that is executed when the message is received. </param>
public void Register<T>(Action<T> action)
{
if (action == null)
{
throw new ArgumentNullException("action");
}
var messageType = typeof(T);
if (actions.ContainsKey(messageType))
{
actions[messageType] = Delegate.Combine(actions[messageType], action);
}
else
{
actions.Add(messageType, action);
}
}
/// <summary>
/// Sends the specified message.
/// </summary>
/// <typeparam name="T"> The type of message. </typeparam>
/// <param name="message"> The message to send. </param>
public void Send<T>(T message)
{
var messageType = typeof(T);
if (actions.ContainsKey(messageType))
{
((Action<T>)actions[messageType])(message);
}
}
/// <summary>
/// Unregister an action.
/// </summary>
/// <typeparam name="T"> The type of message. </typeparam>
/// <param name="action"> The action to unregister. </param>
public void Unregister<T>(Action<T> action)
{
var messageType = typeof(T);
if (actions.ContainsKey(messageType))
{
actions[messageType] = (Action<T>)Delegate.Remove(actions[messageType], action);
}
}
}