using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Reflection; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace Essgee.Utilities { public class InterfaceDictionaryConverter : JsonConverter { public override bool CanConvert(Type objectType) { return (objectType == typeof(TInterface)); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (!objectType.IsGenericType || objectType.GetGenericTypeDefinition() != typeof(Dictionary<,>)) throw new InvalidOperationException("Can only deserialize dictionaries"); var dictionary = (System.Collections.IDictionary)Activator.CreateInstance(objectType); //不再读取配置 var jObject = JObject.Load(reader); foreach (var child in jObject.Children()) { Type type = Assembly.GetExecutingAssembly().GetTypes().FirstOrDefault(y => typeof(TInterface).IsAssignableFrom(y) && !y.IsInterface && !y.IsAbstract && y.Name == child.Path); if (type != null) dictionary.Add(child.Path, JsonConvert.DeserializeObject(child.First.ToString(), type)); } return dictionary; } public override bool CanWrite { get { return false; } } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); } } }