[JsonConverter(typeof(JsonSubtypes))]
public abstract class Shape
{
public int Id { get; set; }
public abstract double Area { get; }
}
public class Circle : Shape
{
public double Radius { get; set; }
public override double Area => Math.PI * Radius * Radius;
}
public class Square : Shape
{
public double SideLength { get; set; }
public override double Area => SideLength * SideLength;
}
public class JsonSubtypes : JsonConverter
{
private readonly Type[] _subtypes;
private readonly string _discriminatorProperty;
public JsonSubtypes()
{
_subtypes = new[]
{
typeof(Circle),
typeof(Square),
};
_discriminatorProperty = "shapeType";
}
public override void WriteJson(JsonWriter writer, Shape value, JsonSerializer serializer)
{
writer.WriteStartObject();
writer.WritePropertyName(_discriminatorProperty);
writer.WriteValue(GetDiscriminatorValue(value));
writer.WritePropertyName("id");
writer.WriteValue(value.Id);
writer.WritePropertyName("area");
writer.WriteValue(value.Area);
writer.WriteEndObject();
}
public override Shape ReadJson(JsonReader reader, Type objectType, Shape existingValue, bool hasExistingValue, JsonSerializer serializer)
{
JObject jObject = JObject.Load(reader);
JToken discriminatorValue = jObject.GetValue(_discriminatorProperty, StringComparison.OrdinalIgnoreCase);
Type type = _subtypes.FirstOrDefault(t => GetDiscriminatorValue((Shape)Activator.CreateInstance(t)) == discriminatorValue.ToString());
if (type == null)
{
throw new InvalidOperationException($"Unknown {nameof(Shape)} type: {discriminatorValue}");
}
return (Shape)jObject.ToObject(type);
}
private string GetDiscriminatorValue(Shape shape)
{
return shape switch
{
Circle _ => "circle",
Square _ => "square",
_ => throw new InvalidOperationException($"Unknown {nameof(Shape)} type: {shape.GetType().Name}"),
};
}
}
var circle = new Circle { Id = 1, Radius = 5 };
var square = new Square { Id = 2, SideLength = 10
上一篇:ASP.netcore7InvalidOperationException:Unabletoresolveservicefortype
下一篇:ASP.NETCore7MVC,EFCore,SQLServer:DbContext连接问题从.NET4.8EF6升级