C# DynamicProxy为PropertyInfo.GetValue返回null(obj,null)
这让我抓狂。我正在使用EntityFramework 6.1.2。下面是一行奇怪的代码:C# DynamicProxy为PropertyInfo.GetValue返回null(obj,null),c#,entity-framework,C#,Entity Framework,这让我抓狂。我正在使用EntityFramework 6.1.2。下面是一行奇怪的代码: var materialBt = prop.GetValue(material, null); 其中,prop是指一对一关联的PropertyInfo,而material是实体的DynamicProxies…代理。通过对基本实体类型而不是DynamicProxy类型调用type.GetProperties来获取prop可能是相关的。如果我从代理类中获取相应的PropertyInfo,也会发生同样的情况,即
var materialBt = prop.GetValue(material, null);
其中,prop
是指一对一关联的PropertyInfo
,而material
是实体的DynamicProxies…
代理。通过对基本实体类型而不是DynamicProxy类型调用type.GetProperties
来获取prop
可能是相关的。如果我从代理类中获取相应的PropertyInfo
,也会发生同样的情况,即material.GetType().GetProperty(prop.Name).GetValue(material,null)
也会返回null
我在这一行之后立即设置了一个断点。执行后,materialBt
为空。但是,如果我使用调试器检查material
,或者通过即时窗口调用prop.GetValue(material,null)
,则所讨论的属性有一个值
这种情况经常发生。我观察到它有时会为materialBt
返回正确的值,但似乎在执行过程中遇到断点时会发生这种情况……那么,它是否有“时间”来获取值呢?但这应该是原子的,不是吗
这是一个懒惰加载的东西吗?PropertyInfo
是从基类而不是代理类获取的问题吗
更正:
进一步研究,似乎只有当我通过调试器检查该值时,才正确返回该值,方法是将鼠标悬停在material
上并展开base
。我发现,事实上,如果在使用GUI检查器之前尝试立即窗口,我会在运行代码返回时得到null
。因此,调试器中的GUI检查器似乎正在触发要填充的属性
更多代码:
或者,如果您想可以发布更多代码吗?这可能是
收益率返回的一些问题
或者IEnumerable
的计算时间问题@Stefan刚刚发布了一些附加信息,可能会有所帮助。您对哪些代码位感兴趣?所讨论的prop
是一个对一的关联,所以我认为它与IEnumerables
无关。好吧,这里延迟的执行时间不是问题,但我确实想知道:为什么您的方法标记为async
?@Stefan在下面有一个对GetByIdAsync
方法的调用,该方法可以进行DB调用,基于EntityKey,它使用此处的反射进行挖掘。那个是异步的,所以我们必须等待它。aarrgghh!!所涉及的属性未标记为虚拟!但是…这让它有时仍然有效???
private async Task Merge (Type type, object ephemeral, object material)
{
PropertyInfo[] props = type.GetProperties();
foreach (PropertyInfo prop in props)
{
//...
if(IsModel(prop.PropertyType))
{
// A belongsTo relationship
--> var materialBt = prop.GetValue(material, null);