public void Handle(CompositeTypeDescriptor composite) { var lhsType = Namespace.Types.FindByName(composite.Name) as CompositeTypeDescriptor; if (lhsType == null) { lhsType = Namespace.CreateCompositeType(composite.Name); } var rhsFields = composite.Fields.ToList(); int fieldIndex = -1; foreach (var field in rhsFields) { ++fieldIndex; var lhsField = lhsType.Fields.FirstOrDefault(_ => _.Name == field.Name); if (lhsField == null) {//TODO optimise int insertionPos = GetInsertPosition(lhsType.Fields.ToList(), rhsFields, fieldIndex); lhsField = lhsType.AddField(field.Name, field.TypeName, field.IsCollection, insertionPos); } if (lhsField.IsCollection != field.IsCollection || lhsField.TypeName != field.TypeName) { _logger.LogWarning("different field definitions lhs:[{lhs}], rhs:[{rhs}]", lhsField.ToXml(), field.ToXml()); } field.AttachedData.Where(_ => !lhsField.AttachedData.Keys.Contains(_.Key)).ToList().ForEach(_ => lhsField.AttachedData.Add(_)); } }