This code works fine with default constructor. How can I create object from constructors with parameters?
private readonly JsonSerializer _serializer;
private static readonly IReadOnlyDictionary<TypeId, Type> _derivedTypes;
static ByTypeIdConverter()
{
var baseType = typeof(T);
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
_derivedTypes = (
from domainAssembly in AppDomain.CurrentDomain.GetAssemblies()
from assemblyType in domainAssembly.GetTypes()
where !assemblyType.IsAbstract && assemblyType.IsSubclassOf(baseType)
select assemblyType).ToDictionary(t => (TypeId)t);
}
public override T? ReadJson(JsonReader reader, Type objectType, T? existingValue, bool hasExistingValue, JsonSerializer serializer)
{
var jObject = JObject.Load(reader);
var typeId = jObject["_t"]?.ToObject<TypeId>();
if (typeId is null || !_derivedTypes.TryGetValue(typeId, out var classType))
throw new JsonSerializationException("Failed to get derived class type from json or found type was not expected");
var creator = _serializer.ContractResolver.ResolveContract(classType).DefaultCreator;
if (creator is null)
{
throw new JsonSerializationException($"Failed create instance of type {classType.Name}");
}
var result = creator();
_serializer.Populate(jObject.CreateReader(), result);
return (T)result;
}
Some additional information I have SomeBase class and custom JsonConverter for that base class. I simply deserialize like this:
JsonConvert.DeserializeObject<SomeBase>(jsonData);