using System.Collections.Concurrent; namespace Milimoe.FunGame.Core.Api.Utility { /// /// 单例表:表中的对象以类名作为Key保存,并以Key获取该对象,Key具有唯一约束 /// 用于储存单例对象使用 /// public class Singleton { private static readonly ConcurrentDictionary SingletonTable = []; /// /// 查询目标的类是否已经有实例 /// /// 单例对象 /// public static bool IsExist(object single) { Type type = single.GetType(); string name = type.FullName ?? type.ToString(); return SingletonTable.ContainsKey(name); } /// /// 将目标和目标的类添加至单例表,如果存在,将更新此类单例 /// /// 单例对象 /// 存入基类 /// public static void AddOrUpdate(object single, bool baseClass = false) { if (single != null) { Type? type = baseClass ? single.GetType().BaseType : single.GetType(); string name = type?.FullName ?? type?.ToString() ?? ""; if (name != "") SingletonTable.AddOrUpdate(name, single, (key, oldValue) => single); } } /// /// 将目标和目标的类从单例表中移除 /// /// 单例对象 /// public static bool Remove(object single) { Type type = single.GetType(); string name = type.FullName ?? type.ToString(); return SingletonTable.TryRemove(name, out _); } /// /// 获取单例对象 /// /// 目标类 /// public static T? Get() { string name = typeof(T).FullName ?? typeof(T).ToString(); if (SingletonTable.TryGetValue(name, out object? value) && value is T single) { return single; } return default; } /// /// 获取单例对象 /// /// 目标类 /// public static object? Get(Type type) { string name = type.FullName ?? type.ToString(); if (SingletonTable.TryGetValue(name, out var value)) { return value; } return null; } } }