using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Collections.Concurrent;
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());
}
}