我们有以下代码,其中,除非我们强制懒惰加载程序停止懒惰,否则它将抛出
System.MissingMemberException:"延迟初始化的类型没有公共的无参数构造函数。">
异常。至少,对于我们已经有了值的情况,我们只是让懒惰的加载程序将其反噬
我的问题是——为什么?为什么会发生这种情况,我该怎么做才能不需要包含var _ = _lazyChild.Value;
?
public class MyContainedClass
{
private readonly int _id;
public MyContainedClass(int id) => _id = id;
}
public class MyContainer
{
private readonly Lazy<MyContainedClass> _lazyChild;
public MyContainer(MyRepository repo, int? childId, MyContainedClass child = null)
{
ChildId = childId;
if (childId != null)
{
_lazyChild = new Lazy<MyContainedClass>(() => child);
//Without the below line, later accessing _lazyAnswerGroup will throw:
//System.MissingMemberException: 'The lazily-initialized type does not have a public, parameterless constructor.'
var _ = _lazyChild.Value;
}
else
{
_lazyChild = new Lazy<MyContainedClass>(() => ChildId.HasValue ? repo.Get(ChildId.Value) : null);
};
}
public int? ChildId { get; set; }
public MyContainedClass Child => _lazyChild.Value;
}
旁注-是的,我知道有一个错误,你传入一个子元素,然后再更改ChildId。我想这是无关的。
我想我已经想通了。我们还调用了一个方法,该方法使用反射在内存中对对象进行深度复制。显然,这不会调用非参数构造函数,因此Lazy<>
没有被正确初始化。