public static AbstractSharedMessage FromJson(string typeShortName, string data) { Type GetTypeForDeserialization() { if (cacheTypes.TryGetValue(typeShortName, out var type)) { return(type); } var allImplementations = ReflectionTools.FindAllImplementations(typeof(AbstractSharedMessage)); foreach (var candidate in allImplementations) { if (candidate.Name == typeShortName) { type = candidate; } cacheTypes[candidate.Name] = type; } return(type); } return((AbstractSharedMessage)JsonConvert.DeserializeObject(data, GetTypeForDeserialization())); }