给定两个对象数组,我需要比较两者之间的差异(当转换为字符串时)。我已将代码简化为以下内容,但问题仍然存在:
public void Compare(object[] array1, object[] array2) {
for (var i = 0; i < array1.Length; i++) {
var value1 = GetStringValue(array1[i]);
var value2 = GetStringValue(array2[i]);
}
}
public string GetStringValue(object value) {
return value != null && value.ToString() != string.Empty ?
value.ToString() : "No Value";
}
无论我扔给它什么对象数组,代码都可以正常执行。但是,如果数组中的一项是引用类型,那么会以某种方式更新引用。这会导致以后出现问题。
似乎在针对对象引用调用 ToString() 时会发生这种情况。我已将 GetStringValue 方法更新为以下内容(确保对象是值类型或字符串)并且问题消失了。
public string GetStringValue(object value) {
return value != null && (value.GetType().IsValueType || value is string)
&& value.ToString() != string.Empty ? value.ToString() : "No Value";
}
然而,这只是一个临时的 hack,因为我希望能够覆盖我的引用类型上的 ToString() 方法并比较它们。
如果有人能解释为什么会发生这种情况并提供潜在的解决方案,我将不胜感激。谢谢
编辑:
帮助进一步解释我的申请。这段代码取自 NHibernate 事件监听器。我认为问题在于 NHibernate 在类周围添加了自己的包装器来处理延迟加载。这是它抛出的错误:
集合 [ * ] 没有被 flush() 处理