是的,这看起来像是复制品-
JsonConverterAttribute
看起来效果不错。为完整起见,以下是解决方案:
...
public class Master : IMaster
{
[JsonConverter(typeof(ModelJsonConverter), typeof(Slave))]
public ISlave ObjectProp {get; set; }
}
...
public class ModelJsonConverter : JsonConverter
{
public Type InstanceType { get; set; }
public ModelJsonConverter(Type instanceType):base()
{
InstanceType = instanceType;
}
public override bool CanWrite => false;
public override bool CanRead => true;
public override bool CanConvert(Type objectType)
{
if (objectType == InstanceType) return true;
else return InstanceType.GetTypeInfo().IsâSubclassâOf(objectType);
}
public override void WriteJson(JsonWriter writer,
object value, JsonSerializer serializer)
{
throw new InvalidOperationException("Use default serialization.");
}
public override object ReadJson(JsonReader reader,
Type objectType, object existingValue,
JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null) return null;
else if (reader.TokenType != JsonToken.StartObject) throw new JsonException($"Unexpected Json token at {reader.Path}: {reader.TokenType.ToString()}");
var deserialized = Activator.CreateInstance(InstanceType);
serializer.Populate(reader, deserialized);
return deserialized;
}
}