我有一个通用类,其中包含一个公共属性,该属性是与父类相同类型的通用接口。以下是示例代码。
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; }
}
我正在使用JSON.net来序列化
MainClass
对象,该对象可以包含许多Parent<T>
对象。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()
方法之前手动向序列化程序添加一个新的InterfaceJsonConverter
,以便为每个预期类型T添加。然而,这限制了可能的Parent<T>
类型,因为如果可以反序列化,则需要手动添加每个类型。有没有办法以通用的方式反序列化它?我应该采取另一种方法吗?