我正在实现自定义(和通用的)json.net serialializer,并在道路上碰到我可以在路上使用一些帮助的道路。
当求职者映射到接口的属性时,我如何才能最好地确定要构造哪种对象,以放置在接口属性中。
我有以下内容:
[JsonConverter(typeof(MyCustomSerializer<foo>))]
class foo
{
int Int1 { get; set; }
IList<string> StringList {get; set; }
}
我的序列化器适当地序列化了这个对象,但是当它返回时,我尝试将json零件映射到对象时,我有一个jarray和一个接口。
我目前正在实例化任何枚举的内容,例如
theList = Activator.CreateInstance(property.PropertyType);
这项工作创建的是在避难过程中使用的,但是当属性是iList时,我会收到(显然)无法实例化接口的运行时投诉。
那么,我怎么知道在这种情况下要创建哪种类型的具体类?
谢谢
您可以创建一个词典,该字典将接口映射到您认为应该是默认的任何类型("接口的默认类型"不是语言中的定义概念):
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);
(我没有尝试过此代码;如果您遇到问题。)