考虑两个类:
public class Entity
{
public ObjectId Id { get; set; }
public E2 e = new E2(ConfigClass.SomeStaticMethod());
}
public class E2
{
[BsonIgnore]
public int counter = 5;
public DateTime last_update { get; set; }
public E2(int c)
{
counter = c;
}
}
我将像这样向 MongoDb 存储然后检索 Entity
类型的对象(假设集合为空):
var collection = database.GetCollection<Entity>("temp");
collection.Save<Entity>(new Entity());
var list = collection.FindAs<Entity>(new QueryDocument());
var ent = list.Single();
无论 ConfigClass.SomeStaticMethod()
返回什么,counter
字段都将为零(整数的默认值)。但如果我向 E2
类添加默认构造函数,则 counter
将是 5
。
这意味着 MongoDb 的 C# 驱动程序在调用非默认构造函数时出现问题(这是完全可以理解的)。我知道 BSON 库中定义了一个 BsonDefaultValue
属性,但它只能接受常量表达式
。
我想做的是从配置文件中加载字段的默认值,同时从 MongoDb 检索对象的其余部分!?当然,用最少的努力。
[更新]
我也对此进行了测试,结果相同:
public class Entity
{
public ObjectId Id { get; set; }
public E2 e = new E2();
public Entity()
{
e.counter = ConfigClass.SomeStaticMethod();
}
}
public class E2
{
[BsonIgnore]
public int counter = 5;
public DateTime last_update { get; set; }
}
运行此代码会导致counter
再次为零!
最佳答案
我成功地实现了这样的目标:
public class Entity
{
public ObjectId Id { get; set; }
public E2 e = new E2();
}
public class E2 : ISupportInitialize
{
[BsonIgnore]
public int counter = 5;
public DateTime last_update { get; set; }
public void BeginInit()
{
}
public void EndInit()
{
counter = ConfigClass.SomeStaticMethod();
}
}
ISupportInitialize
接口(interface)提供了两个方法BeginInit和EndInit,分别在反序列化过程之前和之后调用。它们是设置默认值的最佳位置。
关于c# - 在 MongoDb + C# 中反序列化没有默认构造函数的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19608761/