我正在实现一个自定义(和通用)Json.net序列化程序,并且在我可以使用一些帮助的道路上遇到了障碍。
当反序列化器映射到作为接口的属性时,如何最好地确定要构造的对象类型以反序列化以放入接口属性。
我有以下内容:
[JsonConverter(typeof(MyCustomSerializer<foo>))]
class foo
{
int Int1 { get; set; }
IList<string> StringList {get; set; }
}
我的序列化程序正确地序列化了这个对象,但是当它重新出现时,我尝试将json部分映射到对象,我有一个JArray和一个接口。
我目前正在实例化像List一样可以枚举的任何东西
theList = Activator.CreateInstance(property.PropertyType);
这可以创建在反序列化过程中使用,但是当属性是IList时,我得到运行时抱怨(显然)无法实例化接口。
那么我怎么知道在这种情况下要创建什么类型的具体类呢?
谢谢
答案 0 :(得分:2)
您可以创建一个字典,将接口映射到您认为应该是默认类型的任何类型(“接口的默认类型”不是语言中定义的概念):
var defaultTypeFor = new Dictionary<Type, Type>();
defaultTypeFor[typeof(IList<>)] = typeof(List<>);
...
var type = property.PropertyType;
if (type.IsInterface) {
// TODO: Throw an exception if the type doesn't exist in the dictionary
if (type.IsGenericType) {
type = defaultTypeFor[property.PropertyType.GetGenericTypeDefinition()];
type = type.MakeGenericType(property.PropertyType.GetGenericArguments());
}
else {
type = defaultTypeFor[property.PropertyType];
}
}
theList = Activator.CreateInstance(type);
(我还没试过这段代码;如果你遇到问题,请告诉我。)