为什么一个急切加载的延迟加载器会抛出错误?
Why does an eager-loading lazy-loader throw an error?
我们有以下代码,除非我们强制延迟加载器停止延迟,否则它会抛出一个
System.MissingMemberException: 'The lazily-initialized type does not have a public, parameterless constructor.'
异常。至少,对于我们已经拥有价值的情况,我们只是让延迟加载程序反刍它。
我的问题是 - 为什么?为什么会这样,我该怎么做才能不需要包含 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 时存在错误。我假设那是无关的。
我想我已经明白了。
我们还调用了一个方法,该方法使用反射在内存中创建对象的 deep-copy。
显然,这不会调用 non-parameterless 构造函数,因此 Lazy<>
没有被正确初始化。
我们有以下代码,除非我们强制延迟加载器停止延迟,否则它会抛出一个
System.MissingMemberException: 'The lazily-initialized type does not have a public, parameterless constructor.'
异常。至少,对于我们已经拥有价值的情况,我们只是让延迟加载程序反刍它。
我的问题是 - 为什么?为什么会这样,我该怎么做才能不需要包含 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 时存在错误。我假设那是无关的。
我想我已经明白了。
我们还调用了一个方法,该方法使用反射在内存中创建对象的 deep-copy。
显然,这不会调用 non-parameterless 构造函数,因此 Lazy<>
没有被正确初始化。