我所能想到的唯一可能是竞态条件,但据我所知,调用方法和代码行均为同步。
如果我在循环之前设置断点,并逐步执行一次(或者只是在该行上设置断点),则将执行
/// <summary>
/// Gets the log format string for an info-level log.
/// </summary>
public static string Info<T>(string action, T obj)
{
var stringBuilder = new StringBuilder(String.Format(
"Action: {0} \tObject: {1} \tUser: {2} \tJson: ",
action, typeof(T).Name, User
));
// Set all virtual properties to null. This should stop circular references of navigation properties.
var virtualProperties = typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public).Where(x => x.GetSetMethod().IsVirtual && !x.PropertyType.IsPrimitive);
foreach (var propInfo in virtualProperties)
{
propInfo.SetValue(obj, null); // This Line is the culprit.
}
GetJsonSerializer().Serialize(obj, stringBuilder);
return stringBuilder.ToString();
}
如果我在循环之前设置断点,并逐步执行一次(或者只是在该行上设置断点),则将执行
propInfo.SetValue(obj,null)
代码行,但如果我不使用断点,则它永远不会将属性设置为null。为什么会这样?
具体详情:
- 如果我不使用断点,则无法正常工作。
- 如果我在foreach的顶部放置一个断点并按f5键,它不起作用。
- 如果我在foreach的顶部放置断点并通过f10逐步执行,它就能正常工作。
- 如果我在
propInfo.SetValue(obj,null);
代码行上放置断点,则它可以正常工作。 - 循环后的断点仍显示值不为null。
- 如果我将
null
更改为5
(这不是有效值),则会引发异常,告诉我它不是有效值。
澄清一下,“不起作用”意味着它不能将属性设为null。
我尝试过:- 重启Visual Studio(2013)
- 更改代码行(以前是
default(T)
) - 项目属性->生成->优化代码(最初关闭)
已经缩小范围,EF导航属性是这种行为的原因。代码正在运行,但由于某种原因,导航属性拒绝成为空。那么关于导航属性有什么特别之处导致了这种行为呢?
T
类型会发生什么?也许实体框架没有“接受”属性更改,我们可能能够确定原因。 - 31eee384