using System.Reflection; using Fantasy; using Fantasy.Helper; using Newtonsoft.Json.Linq; // ReSharper disable SuspiciousTypeConversion.Global namespace NBF.ConfigTable { /// /// 配置表帮助类 /// public static class ConfigTableHelper { private static readonly Dictionary _dictionary = new Dictionary(); public static void Initialize() { //解析配置文件 var gameConfigText = File.ReadAllText(Path.Combine(AppContext.BaseDirectory, "configs.Json")); Initialize(gameConfigText, typeof(Fantasy.AssemblyHelper).Assembly); } /// /// 初始化ConfigTableHelper /// public static void Initialize(string json, params System.Reflection.Assembly[] assemblies) { _dictionary.Clear(); var jsonObj = JObject.Parse(json); Dictionary tokens = new(); foreach (var item in jsonObj) { try { var name = item.Key; var value = item.Value; if (value is JArray jArray) { tokens[name] = jArray; } } catch (Exception e) { Log.Error($"读表异常,请检查,name={item.Key} ex={e}"); } } foreach (var type in GetAllConfigTableTypes(assemblies)) { var name = type.Name; if (tokens.TryGetValue(name, out var jArray)) { // 通过反射调用 ParseJson 方法 var parseMethod = type.GetMethod("ParseJson", BindingFlags.Public | BindingFlags.Static); parseMethod?.Invoke(null, [jArray]); } } // var d = _dictionary; } public static ConfigContext? Table() where T : IConfigTable { var type = typeof(T); if (_dictionary.TryGetValue(type, out var context)) { return context as ConfigContext; } var jsonContext = new ConfigContext(); _dictionary[type] = jsonContext; return jsonContext; } public static List ParseLine(JArray arr) where T : IConfigTable, new() { List list = new List(); foreach (var jToken in arr) { T? instance = jToken.ToObject(); if (instance != null) { list.Add(instance); } } var context = Table(); context?.Association(list); return list; } /// /// 获取所有实现了 IConfigTable 接口的非抽象类 /// /// 所有非抽象的配置对象类 private static List GetAllConfigTableTypes(params System.Reflection.Assembly[] assemblies) { var types = new List(); var interfaceType = typeof(IConfigTable); // 遍历当前程序集中的所有类型 foreach (var assembly in assemblies) { foreach (var type in assembly.GetTypes()) { // 检查是否实现了 IConfigTable 接口,并且不是抽象类 if (interfaceType.IsAssignableFrom(type) && !type.IsAbstract && !type.IsInterface) { types.Add(type); } } } return types; } } }