【发布时间】:2014-09-17 13:04:15
【问题描述】:
我正在尝试使用官方 C# 驱动程序存储从 mongodb 中的非泛型基类继承的泛型类的对象列表。
我的代码如下所示:
abstract class MyAbstractClass {}
class MyGenericClass<T>: MyAbstractClass
{
[BsonRequired]
public List<T> Values = new List<T>();
public MyGenericClass(IEnumerable<T> values)
{
Values.AddRange(values);
}
}
class MyContainerClass
{
[BsonId]
public string Id;
[BsonRequired]
public List<MyAbstractClass> ValueCollections = new List<MyAbstractClass>();
public MyContainerClass()
{
Id = Guid.NewGuid().ToString();
}
}
在测试时,我创建一个容器对象并用泛型类的实例填充它,如下所示:
var container = new MyContainerClass();
container.ValueCollections.Add(new MyGenericClass<string>(new[]{"foo","bar","baz"}));
当我将它保存到数据库时,添加的文档如下所示:
{
"_id": "c5cf5cd1-843f-4d5d-ba8f-5859ae62fd1d",
"ValueCollections": [
{
"_t": "MyGenericClass`1",
"Values": [
"foo",
"bar",
"baz"
]
}
]
}
类型鉴别器获取类型“MyGenericClass'1”而不是“MyGenericClass'1[System.String]”,这意味着它不可能再次反序列化。
此外,当尝试从数据库加载这些对象时,我收到一条错误消息:无法创建抽象类的实例。但是类型鉴别器(如果它是正确的)应该允许驱动程序看到它不应该创建 MyAbstractClass 类型的对象,而是 MyGenericClass
所以我的问题是: 1. 为什么会出现这个错误? 2. 为什么没有正确序列化判别器?
感谢您的宝贵时间。
【问题讨论】:
标签: c# .net mongodb generics inheritance