我正在使用一个外部库,它返回一个对象数组,用于旧状态和对象的当前状态(数组中的每个项代表属性及其值)。到目前为止,我想出了:
for(var i = 0; i< oldState.Length; i ++){ return oldState [i] .Equals(state [i]); }
这会比较所有顶级属性。但我也希望深入研究复杂属性的一些(标有属性CompareComplex的那些),并比较它们的属性之间的差异。我想最好的方法是使用递归函数。我无法理解这一点,但我确信解决方案非常简单。
如果有人可以提供帮助,我真的很感激。感谢
答案 0 :(得分:2)
答案 1 :(得分:0)
迭代的方法可能是:
oldObject
和object
)像:
for (var i = 0; i < oldState.Length; i++)
{
ObjectType oldObject = oldState[i];
ObjectType object= state[i];
\\insert your comparison code here
oldObject.Property.Equals(object.Property);
}
重要的是,取出return语句,以便在i == 0
的迭代后执行不会停止,并将结果保存在另一个对象中。
答案 2 :(得分:0)
为你的答案欢呼,我设法提出了以下方法:
private bool Compare(Type type, string[] propertyNames, object[] oldState, object[] state) {
// Get the property indexes to ignore
var propertyIndexesToIgnore = type.GetProperties()
.Where(p => p.GetCustomAttributes(typeof(IgnoreLoggingAttribute), false).Count() > 0)
.Select(p => Array.IndexOf(propertyNames, p.Name)).ToArray();
// Get the child property indexes
var childPropertyIndexes = type.GetProperties()
.Where(p => p.GetCustomAttributes(typeof(ChildLoggingAttribute), false).Count() > 0)
.Select(p => Array.IndexOf(propertyNames, p.Name)).ToArray();
for (var i = 0; i < oldState.Length; i++) {
// If we need to check the child properties
if (childPropertyIndexes.Contains(i)) {
if (oldState[i] == null)
break;
var childPropertyType = oldState[i].GetType();
var childProperties = oldState[i].GetType().GetProperties();
// Recursively call this function to check the child properties
if (Compare(childPropertyType, childProperties.Select(p => p.Name).ToArray(), childProperties.Select(p => p.GetValue(oldState[i], null)).ToArray<object>(), childProperties.Select(p => p.GetValue(state[i], null)).ToArray<object>()))
return true;
} else if (!propertyIndexesToIgnore.Contains(i) && ((oldState[i] != null && state[i] != null && !oldState[i].Equals(state[i])) || (oldState[i] != null && state[i] == null) || (oldState[i] == null && state[i] != null)))
return true;
}
return false;
}
有几点需要注意:
如果有人对如何改进这一点有任何建议,那么我真的很感激。感谢