using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using Newtonsoft.Json.Linq; namespace NBC { /// /// 配置表帮助类 /// public static class ConfigTableHelper { private static readonly Dictionary _dictionary = new Dictionary(); /// /// 初始化ConfigTableHelper /// public static void Initialize(string json) { 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}"); } } //反射获取所有IConfigTable的非抽象类 var tableTypes = GetAllConfigTableTypes(); foreach (var type in tableTypes) { var name = type.Name; if (tokens.TryGetValue(name, out var jArray)) { // 通过反射调用 ParseJson 方法 var parseMethod = type.GetMethod("ParseJson", BindingFlags.Public | BindingFlags.Static); parseMethod?.Invoke(null, new object[] { jArray }); } } } 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() { var types = new List(); var interfaceType = typeof(IConfigTable); // 遍历当前程序集中的所有类型 foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { foreach (var type in assembly.GetTypes()) { // 检查是否实现了 IConfigTable 接口,并且不是抽象类 if (interfaceType.IsAssignableFrom(type) && !type.IsAbstract && !type.IsInterface) { types.Add(type); } } } return types; } } }