我使用的mongo C#驱动程序版本是1.1。我的代码结构如下所示。
public abstract Class BaseClass
{
public int BCProp {get; set;}
}
public class DerivedClass1 : BaseClass
{
public int DCProp1 {get; set;}
}
public class DerivedClass2 : BaseClass
{
public int DCProp2 {get; set;}
}
public class ClassOfInterest
{
public int Prop1 {get; set;}
// I want to bring back only certain values
// from the elements in this array while deserializing
public BaseClass[] ElementArray {get; set;}
}
在将文档插入MongoDB之前,我使用BsonClassMap注册类,并使用Namespace将标识符设置为Class Name。因此,当我创建ClassOfInterest的对象并且ElementArray是DerivedClass1元素类型的数组时,当我将其插入到DB中时,数组元素具有" _t" as" DerivedClass1"。关于Polymorphic classes and Discriminators的文档,所有看起来都很好。
出于某种原因,我决定只反序列化ClassOfInterest的一些属性。我不想反序列化Prop1,我只想要ElementArray,所以我写了这样的代码
// Here I am specifying that I am interested only in ElementArray
// A Element in ElementArray will be of type DerivedClass1 and will
// include both BCProp and DCProp1
FieldsBuilder _fb = new FieldsBuilder();
_fb.Include("ElementArray");
List<string> IncludedFields = new List<string>();
var dic = _fb.ToBsonDocument().ToDictionary();
IncludedFields.AddRange(dic.Keys.ToList());
// I am querying DB
MongoCollection<ClassOfInterest> mcoll = ActiveDb.GetCollection<ClassOfInterest>(COICollName);
List<ClassOfInterest> COIObjects = mcoll.FindAll().SetFields(IncludedFields.ToArray()).ToList();
以上工作正常。返回的对象只有ElementArray,不包含Prop1。鉴别器工作,返回的对象在ElementArray中具有DerivedClass1类型的元素。
再次,出于某种原因,我不想反序列化DerivedClass1中的所有内容。所以我在下面做。
// Notice that I want to get back only BCProp in all ElementArray
FieldsBuilder _fb = new FieldsBuilder();
_fb.Include("ElementArray.BCProp");
List<string> IncludedFields = new List<string>();
var dic = _fb.ToBsonDocument().ToDictionary();
IncludedFields.AddRange(dic.Keys.ToList());
// I am querying DB
MongoCollection<ClassOfInterest> mcoll = ActiveDb.GetCollection<ClassOfInterest>(COICollName);
List<ClassOfInterest> COIObjects = mcoll.FindAll().SetFields(IncludedFields.ToArray()).ToList();
但是,这次我收到错误&#34;无法创建抽象类的实例&#34;
这次出了什么问题?如果我要求整个ElementArray,它会将Element Array中的Elements正确反序列化为DerivedClass1。但是,当我要求特定属性(属于基类)时,我得到错误。
答案 0 :(得分:1)
我没有要求鉴别器,因此解串器不知道如何处理它并试图创建抽象类的对象。 而不是只做
_fb.Include("ElementArray.BCProp")
我做了
_fb.Include("ElementArray.BCProp");
_fb.Include("ElementArray._t");
现在有效。