我能想到的唯一的事情是竞争条件,但调用函数和代码行是我的知识同步。行代码不工作,除非通过使用断点逐步
/// <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)
如果我在循环之前刚刚断点,并通过一个接一个步骤(或只在该行打破)将执行但是如果我不使用断点它从来没有设置该属性的线( ies)为空。为什么是这样?
具体细节:
- 如果我不使用断点这是行不通的。
- 如果我在foreach的顶部放置一个断点并按f5,它不起作用。
- 如果我在foreach的顶部放置一个断点并通过f10执行,它确实有效。
- 如果我在代码行
propInfo.SetValue(obj, null);
上放置一个断点,它确实有效。 - 循环后的断点仍显示为非空值。
- 如果我将
null
更改为5
(这不是有效值),它会引发异常,告诉我它不是有效值。
澄清,“不起作用”意味着它不会将该属性设置为null。
我已经试过什么:
- 重新启动Visual Studio中(2013年)
- 改变的代码行(以前是
default(T)
) - 项目属性 - >建设 - >优化代码(最初关闭)
EDIT
已经缩小了EF导航属性是导致此行为的原因。代码正在运行,但由于某些原因导航属性拒绝成为空。那么导航属性如何导致这种行为?
发生什么事了,如果在传入之前有任何东西需要obj? – lintmouse
我正在提交它进行编辑。它通过EF保存到数据库。然后我通过它来序列化和记录。在这种情况下,我无法想象任何事情会影响它,但我认为任何事情都是可能的。在此功能之后,log4net将日志条目保存到数据库。 – Shelby115
如果您尝试非EF'T'类型,会发生什么?也许有可能实体框架不是“接受”财产变化,我们可能能够确定这个原因。 – 31eee384