public TypeDescriptorCompareResult CompareWith(TypeDescriptor previous) { var result = new TypeDescriptorCompareResult(); var prevFields = previous.Fields.ToDictionary(x => x.Name, x => x); foreach (var field in Fields.Where(f => !f.IsTransient)) { FieldDescriptor currentField; if (!prevFields.TryGetValue(field.Name, out currentField)) { // field is missing in the previous version of the class result.FieldsAdded.Add(field); continue; } // are the types compatible? var compareResult = currentField.CompareWith(field); if (compareResult != FieldDescriptor.CompareResult.Match) { result.FieldsChanged.Add(field); } // why do we remove a field from current ones? if some field is still left after our operation, then field addition occured // we have to check that, cause it can be illegal from the version tolerance point of view prevFields.Remove(field.Name); } // result should also contain transient fields, because some of them may // be marked with the [Constructor] attribute foreach (var nonTransient in prevFields.Values.Where(x => !x.IsTransient)) { result.FieldsRemoved.Add(nonTransient); } return(result); }
public TypeDescriptorCompareResult CompareWith(TypeFullDescriptor previous, VersionToleranceLevel versionToleranceLevel = 0) { var result = new TypeDescriptorCompareResult(); var prevFields = previous.fields.ToDictionary(x => x.FullName, x => x); foreach(var field in fields.Where(f => !f.IsTransient)) { FieldDescriptor currentField; if(!prevFields.TryGetValue(field.FullName, out currentField)) { // field is missing in the previous version of the class result.FieldsAdded.Add(field); continue; } // are the types compatible? var compareResult = currentField.CompareWith(field, versionToleranceLevel); if(compareResult != FieldDescriptor.CompareResult.Match) { result.FieldsChanged.Add(field); } // why do we remove a field from current ones? if some field is still left after our operation, then field addition occured // we have to check that, cause it can be illegal from the version tolerance point of view prevFields.Remove(field.FullName); } // result should also contain transient fields, because some of them may // be marked with the [Constructor] attribute foreach(var nonTransient in prevFields.Values.Where(x => !x.IsTransient)) { result.FieldsRemoved.Add(nonTransient); } return result; }