【发布时间】:2015-11-03 11:11:08
【问题描述】:
出于性能原因,我创建了一个自定义 List 类,该类维护一组项目 ID:
public class MyCustomList : List<ItemWithID>
{
private HashSet<int> itemIDs = new HashSet<int>();
public MyCustomList()
{
}
[JsonConstructor]
public MyCustomList(IEnumerable<ItemWithID> collection)
: base(collection)
{
itemIDs = new HashSet<int>(this.Select(i => i.ID));
}
public new void Add(ItemWithID item)
{
base.Add(item);
itemIDs.Add(item.ID);
}
public new bool Remove(ItemWithID item)
{
var removed = base.Remove(item);
if (removed)
{
itemIDs.Remove(item.ID);
}
return removed;
}
public bool ContainsID(int id)
{
return itemIDs.Contains(id);
}
}
我想从一个简单的 JSON 数组中反序列化这个 List,例如:
JsonConvert.DeserializeObject<MyCustomList>("[{ID:8},{ID:9}]");
这将导致 JSON.NET 仅调用空构造函数,因此我的 itemIDs 列表保持为空。也不会调用 Add 方法。
JSON.NET 如何将项目添加到列表中,以便我可以在该位置添加逻辑。
(这是关于反序列化没有应该在json字符串中持久存在的属性,所以建议的重复问题与这个无关)
【问题讨论】:
-
不是重复的(见更新的问题)
-
您的问题不在于 JSON 反序列化,如果您希望能够覆盖
Add方法,您的MyCustomList需要从IList派生。详情请见THIS。 -
@Meehow 谢谢,现在我明白了 new 和 override 之间的区别。将此作为答案,我会接受。
-
亲爱的@jan-s,您不喜欢我的答案吗?因为您将 45 分钟后发布的另一个答案标记为答案,其中包含实际工作代码?
-
@OguzOzgul 是的,你的答案是一个解决方案,但我错过了一个解释。
标签: c# json inheritance json.net