私は、親クラスと同じタイプのジェネリックインターフェイスであるパブリックプロパティを含むジェネリッククラスを持っています。以下のコード例。ジェネリックインターフェイスプロパティにJSONを逆シリアル化する
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; }
}
私は多くのParent<T>
オブジェクトを含めることができますMainClass
オブジェクトをシリアル化するためにJSON.netを使用しています。 Parent<T>
は、型の制約のない任意の一般的なものにすることができます。しかし、一般的な方法でJSONを逆シリアル化することはできません。
JSON.netデシリアライザ用にJsonConverter
を作成しようとしましたが、一般的に適用する方法が見つかりません。例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);
}
}
上記コンバータは、属性のようなParent<T>
クラスのExampleItem
プロパティに配置することができるようになる:
public class Parent<T>
{
public string ParentName { get; set; }
[JsonConverter(typeof(InterfaceJsonConverter<IExample<T>, Example<T>>))]
public IExample<T> ExampleItem { get; set; }
}
しかし、C#のは、あなたが属性でジェネリック型の参照を持って聞かせていません(理由の属性の性質と反映)。私が今までに思いついた唯一の解決策は、Deserialize()
メソッドを呼び出す前に、シリアライザにそれぞれの予想されるタイプTに新しいInterfaceJsonConverter
を手動で追加することです。ただし、デシリアライズできる場合は、各タイプを手動で追加する必要があるため、可能なタイプはParent<T>
です。
一般的な方法でこれを逆シリアル化する方法はありますか?私が取るべき別のアプローチがありますか?
これは機能しました!コンバータの内部で反射を使用することについて考えなかった - すばらしい解決策。ありがとうございました! – jeff17237