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;
}
}
}