Mam klasę ogólną, która zawiera właściwość publiczną, która jest interfejsem generycznym tego samego typu, co klasa nadrzędna. Przykładowy kod poniżej.Deserializowanie JSON do ogólnej właściwości interfejsu
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; }
}
Używam Json.NET do serializacji obiektu MainClass
który może zawierać wiele Parent<T>
obiektów. Parent<T>
może być dowolnym typem bez ograniczeń typu. Jednak nie mogę zdegradować wynikowego JSON w sposób ogólny.
Podjęto próbę utworzenia JsonConverter
dla deserializera JSON.net, ale nie mogę znaleźć sposobu, aby zastosować go ogólnie. Przykład poniżej: JsonConverter
.
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);
}
}
Powyższy konwerter pozwoli atrybutem być umieszczone na posesji ExampleItem
z Parent<T>
klasy jak:
public class Parent<T>
{
public string ParentName { get; set; }
[JsonConverter(typeof(InterfaceJsonConverter<IExample<T>, Example<T>>))]
public IExample<T> ExampleItem { get; set; }
}
Ale C# nie pozwalają mieć ogólne odniesienia typu w atrybutach (ze względu na charakter atrybutów i refleksji). Jedynym rozwiązaniem, jakie do tej pory wymyśliłem, jest ręczne dodanie do serializera nowego InterfaceJsonConverter
dla każdego oczekiwanego typu T przed wywołaniem metody Deserialize()
. Ogranicza to jednak możliwe typy Parent<T>
, ponieważ każdy typ należy dodać ręcznie, jeśli można go przekształcić w postać szeregową.
Czy istnieje sposób deserializacji tego w sposób ogólny? Czy istnieje inne podejście, które powinienem podjąć?
To działało! Nie myślałem o użyciu odbicia wewnątrz konwertera - świetne rozwiązanie. Dziękuję Ci! – jeff17237