using System; using System.Collections.Generic; using System.Text; namespace BITKit { /// 泛型事件,简单的事件接口 public interface IGenericEvent { void AddListener(Action action); void Invoke(T value); void Invoke() where T : new(); void RemoveListener(Action action); void AddListener(TKey key, Action action); void Invoke(TKey key, T value); void RemoveListener(TKey key, Action action); } /// 泛型数据库,主要使用方式为Get和Set public interface IDatabase { T Get(string key = Constant.System.Internal); void Set(T value); void Set(string key = Constant.System.Internal, T value = default); } public class GenericEvent : IGenericEvent, IDatabase, IDiagnostics { Dictionary> events = new(); Dictionary dictionary = new(); public const string defaultEventName = nameof(GenericEvent); public void AddListener(Action action) => AddListener(defaultEventName, action); public void Invoke(T value) => Invoke(defaultEventName, value); public void RemoveListener(Action action) => RemoveListener(defaultEventName, action); public void AddListener(string key, Action action) { key = key.GetType(); var list = events.Get(key); list.Add(action); } public void Invoke(string key, T value) { key = key.GetType(); var list = events.Get(key); dictionary.Set(key, value); list.ToArray().ForEach(x => { if (x is Action action) { action.Invoke(value); } }); } public void Invoke(string typeName, object value) { var key = $"{typeName}.{defaultEventName}"; var list = events.Get(key); //BIT4Log.Log($"{key}\t@\t{list.Count}"); foreach (var item in list.ToArray()) { //BIT4Log.Log($"event:{item}"); item.GetType().GetMethod("Invoke").Invoke(item, new object[] { value }); } } public T Get(string key = Constant.System.Internal) { key = key.GetType(); var value = dictionary.Get(key); if (value is T t) { return t; } return default; } public object Get(string key = Constant.System.Internal) { return dictionary[key]; } public void Set(T value) => dictionary.Set(Constant.System.Internal.GetType(), value); public void Set(string key, T value) => dictionary.Set(key.GetType(), value); public void RemoveListener(string key, Action action) { key = key.GetType(); var list = events.Get(key); list.TryRemove(action); } public void DebugAllValues() { StringBuilder stringBuilder = new(); stringBuilder.AppendLine($"Event Count:{events.Count}"); foreach (var x in events) { stringBuilder.AppendLine(x.ToString()); } BIT4Log.Log(stringBuilder); } public string GetName() => nameof(GenericEvent); public object GetDiagnostics() { StringBuilder stringBuilder = new("——————Dictionary"); foreach (var x in dictionary) { stringBuilder.AppendLine(x.ToString()); } stringBuilder.AppendLine("——————Events"); foreach (var x in events) { stringBuilder.AppendLine($"{x.Key}\t{x.Value.Count}"); } return stringBuilder; } public void Invoke() where T : new() => Invoke(new T()); } }