InvalidOperationException:无法使用在抽象类上声明的构造函数编译 NewExpression

And*_*rei 5 .net c# mongodb .net-core mongodb-.net-driver

尝试从 mongodb 检索对象时出错:

InvalidOperationException:无法使用在抽象类上声明的构造函数编译 NewExpression

我的班级是:

public class App 
{
    public List<Feature> Features { get; set; }
}

public abstract class Feature
{
    public string Name { get; set; }
}

public class ConcreteFeature : Feature
{
    public string ConcreteProp { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

不知道为什么它有抽象问题。我明白了,mongodb 记录了_t: "ConcreteFeature"类型名称,它具有反序列化的所有功能。我在抽象类中没有构造函数。

想法?

And*_*rei 8

我需要为 BsonClassMap 列出“KnownTypes”以使其工作:

BsonClassMap.RegisterClassMap<Feature>(cm => {
    cm.AutoMap();
    cm.SetIsRootClass(true);

    var featureType = typeof(Feature);
    featureType.Assembly.GetTypes()
        .Where(type => featureType.IsAssignableFrom(type)).ToList()
        .ForEach(type => cm.AddKnownType(type));
});
Run Code Online (Sandbox Code Playgroud)

这样,即使您添加新类型,只要它们在 1 个程序集中,您也不需要修改代码。更多信息在这里


小智 5

1.关于抽象类的使用

[BsonDiscriminator(Required = true)]
[BsonKnownTypes(typeof(ConcreteFeature)]
public abstract class Feature
{
    public string Name { get; set; }
}


public class ConcreteFeature : Feature
{
    public string ConcreteProp { get; set; }
}
Run Code Online (Sandbox Code Playgroud)