using System;
using System.Collections.Generic;
using System.Reflection;
namespace DataPro.Core.EventManager
{
///
/// Delegate used by event listeners
///
///
///
public delegate void SubscriberCallbackDelegate(T item) where T : class;
public delegate void DiagnosticCallbackDelegate(EventDiagnosticType eventType, Type t, object eventData, string listener);
///
/// Allows components to publish events without knowing who is listening
///
public static class EventManager
{
///
/// Tracks listeners
///
private static readonly Dictionary> SubscriberList = new Dictionary>();
///
/// Tracks diagnostic listeners
///
private static readonly List DiagnosticList = new List();
///
/// Publish an event
///
/// type of event
/// event listener
public static void Publish(T eventData) where T : class
{
if (!SubscriberList.ContainsKey(typeof(T))) return;
var listeners = SubscriberList[typeof(T)];
foreach (var listener in listeners)
{
var metaData = listener as EventMetaData;
if (metaData == null) continue;
var triggerCallback = true;
if (metaData.EventFilter != null)
{
triggerCallback = metaData.EventFilter(eventData);
}
if (triggerCallback)
{
metaData.Callback(eventData);
}
SendDiagnosticEvent(EventDiagnosticType.PublishEvent, typeof(T), eventData, metaData.EventFilter != null ? metaData.EventFilter.Method : null);
}
}
///
/// Subscribe to an event
///
/// type of event
/// event listener
public static void Subscribe(SubscriberCallbackDelegate listener) where T : class
{
Subscribe(listener, null);
}
///
/// Subscribe to an event
///
/// type of event
/// event listener
/// predicate to filter events sent to event listener
public static void Subscribe(SubscriberCallbackDelegate listener, Predicate eventFilter) where T : class
{
if (!SubscriberList.ContainsKey(typeof(T)))
{
SubscriberList.Add(typeof(T), new List