Tôi có một lớp chung chứa một thuộc tính công khai là giao diện chung của cùng loại với lớp cha. Mã ví dụ bên dưới.Deserializing JSON thành thuộc tính giao diện chung
public interface IExample<T>
{
T Value { get; set; }
string Name { get; set; }
}
public class Example<T> : IExample<T>
{
public string Name { get; set; }
public T Value { get; set; }
}
public class Parent<T>
{
public string ParentName { get; set; }
public IExample<T> ExampleItem { get; set; }
}
public class MainClass
{
public Parent<int> IntParent { get; set; }
}
Tôi đang sử dụng JSON.net để tuần tự hóa đối tượng MainClass
có thể chứa nhiều đối tượng Parent<T>
. Parent<T>
có thể là bất kỳ chung chung không có ràng buộc loại. Tuy nhiên, tôi không thể dường như deserialize JSON kết quả trong một thời trang chung chung.
Tôi đã cố gắng tạo một JsonConverter
cho trình gỡ rối JSON.net, nhưng tôi không thể tìm cách áp dụng nó một cách tổng quát. Ví dụ JsonConverter
bên dưới.
public class InterfaceJsonConverter<TInterface, TImplementation> : JsonConverter where TImplementation : TInterface, new()
{
public override bool CanConvert(Type objectType)
{
return (typeof(TInterface) == objectType);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return serializer.Deserialize<TImplementation>(reader);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, value);
}
}
Bộ chuyển đổi trên sẽ cho phép một thuộc tính được đặt trên ExampleItem
tài sản của Parent<T>
lớp như:
public class Parent<T>
{
public string ParentName { get; set; }
[JsonConverter(typeof(InterfaceJsonConverter<IExample<T>, Example<T>>))]
public IExample<T> ExampleItem { get; set; }
}
Nhưng C# không cho phép bạn có tài liệu tham khảo kiểu chung chung trong các thuộc tính (vì bản chất của các thuộc tính và sự phản chiếu). Giải pháp duy nhất tôi đã đưa ra cho đến nay là thêm InterfaceJsonConverter
mới cho mỗi kiểu T dự kiến theo cách thủ công vào bộ nối tiếp trước khi gọi phương thức Deserialize()
. Tuy nhiên, điều này giới hạn các loại có thể là Parent<T>
vì mỗi loại cần phải được thêm thủ công nếu có thể được loại bỏ.
Có cách nào để deserialize điều này một cách chung chung? Có cách tiếp cận khác mà tôi nên dùng không?
Điều này đã hiệu quả! Không nghĩ về việc sử dụng sự phản chiếu bên trong bộ chuyển đổi - giải pháp tuyệt vời. Cảm ơn bạn! – jeff17237