using Newtonsoft.Json; using System.Reflection; namespace Campofinale.Resource { public class ResourceLoader { /// /// Load table cfg automatically inside ResourceManager fields /// public static void LoadTableCfg() { var tableCfgTypes = GetAllTableCfgTypes(); foreach (var type in tableCfgTypes) { var attr = type.GetCustomAttribute(); string json = ResourceManager.ReadJsonFile(attr.Name); FieldInfo field = GetResourceField(type); if (field != null && json.Length > 0) { object deserializedData = DeserializeJson(json, field.FieldType, type); field.SetValue(null, deserializedData); //Logger.Print($"Loaded {attr.Name} into {field.Name}"); } } } private static object DeserializeJson(string json, Type fieldType, Type valueType) { if (fieldType.IsGenericType) { var genericTypeDef = fieldType.GetGenericTypeDefinition(); if (genericTypeDef == typeof(Dictionary<,>)) { var keyType = fieldType.GetGenericArguments()[0]; var valType = fieldType.GetGenericArguments()[1]; return JsonConvert.DeserializeObject(json, typeof(Dictionary<,>).MakeGenericType(keyType, valType)); } else if (genericTypeDef == typeof(List<>)) { return JsonConvert.DeserializeObject(json, typeof(List<>).MakeGenericType(valueType)); } } return JsonConvert.DeserializeObject(json, valueType); } public static List GetAllTableCfgTypes() { return Assembly.GetExecutingAssembly() .GetTypes() .Where(t => t.IsClass && !t.IsAbstract && t.GetCustomAttribute() != null) .ToList(); } public static FieldInfo GetResourceField(Type type) { var resourceManagerType = typeof(ResourceManager); var fields = resourceManagerType.GetFields(BindingFlags.Public | BindingFlags.Static); foreach (var field in fields) { var fieldType = field.FieldType; if (fieldType.IsGenericType) { var genericTypeDef = fieldType.GetGenericTypeDefinition(); if (genericTypeDef == typeof(Dictionary<,>)) { var valueType = fieldType.GetGenericArguments()[1]; if (valueType == type) { return field; } } else if (genericTypeDef == typeof(List<>) && fieldType.GetGenericArguments()[0] == type) { return field; } } else { if (fieldType == type) { return field; } } } return null; } } }