/// <summary> /// Prepares the data for the undo. /// </summary> /// <returns>The prepared undo action data.</returns> public DataPrepared PrepareData() { var data = Data; var count = data.Values1.Length; var diff = new MemberComparison[count]; for (int i = 0; i < count; i++) { diff[i] = new MemberComparison(Members[i], data.Values1[i].Value, data.Values2[i].Value); } return(new DataPrepared { Diff = diff, TargetInstance = data.Instance.Value ?? TargetInstance, }); }
/// <summary> /// This function removes overrides from an array of /// MemberInfo[] while retaining original order of /// the members in the array. /// </summary> private Object TrimMembers(Object memberArray, Type type) { MemberInfo[] members = (MemberInfo[])(memberArray); BitArray visibleMask = new BitArray(members.Length, false); int count = 0; int best; // Technically speaking, this algorithm // should not touch a type twice in the // inner loop. Need to fix that up // Real Soon Now (tm). for (int i = 0; i < members.Length; i++) { best = i; for (int j = 0; j < members.Length; j++) { if (i == j || members[j].Name != members[best].Name) { continue; } MemberComparison cmp = CompareMembers(members[j], members[best]); if (cmp == MemberComparison.None) { break; } if ((cmp & MemberComparison.Candidate) != 0) { if ((cmp & MemberComparison.Override) != 0) { best = j; } } } /* speed up, use get/set instead of indexer * if(visibleMask[best] == false) * { * visibleMask[best] = true; * count++; * } */ if (visibleMask.Get(best) == false) { visibleMask.Set(best, true); count++; } } MemberInfo [] newMembers = (MemberInfo[])Array.CreateInstance(type, count); for (int i = 0, j = 0; i < visibleMask.Count; i++) { /* speed up, use get/set instead of indexer * if(visibleMask[i] == true) * { * newMembers[j++] = members[i]; * } */ if (visibleMask.Get(i) == true) { newMembers[j++] = members[i]; } } return(newMembers); }