private RepositoryItemBase CopyRIObject(RepositoryItemBase repoItemToCopy) { Type objType = repoItemToCopy.GetType(); var targetObj = Activator.CreateInstance(objType) as RepositoryItemBase; var objMembers = repoItemToCopy.GetType().GetMembers().Where(x => (x.MemberType == MemberTypes.Property || x.MemberType == MemberTypes.Field)); repoItemToCopy.PrepareItemToBeCopied(); targetObj.PreDeserialization(); Parallel.ForEach(objMembers, mi => { try { if (IsDoNotBackupAttr(mi)) { return; } object memberValue = null; if (mi.MemberType == MemberTypes.Property) { var propInfo = repoItemToCopy.GetType().GetProperty(mi.Name); if (propInfo.CanWrite) { memberValue = propInfo.GetValue(repoItemToCopy); if (memberValue is IObservableList && typeof(IObservableList).IsAssignableFrom(propInfo.PropertyType)) { var copiedList = (IObservableList)propInfo.GetValue(targetObj); if (copiedList == null) { Type listItemType = memberValue.GetType().GetGenericArguments().SingleOrDefault(); var listOfType = typeof(ObservableList <>).MakeGenericType(listItemType); copiedList = (IObservableList)Activator.CreateInstance(listOfType); } CopyRIList((IObservableList)memberValue, copiedList); propInfo.SetValue(targetObj, copiedList); } else { propInfo.SetValue(targetObj, memberValue); } } } else { FieldInfo fieldInfo = repoItemToCopy.GetType().GetField(mi.Name); memberValue = fieldInfo.GetValue(repoItemToCopy); fieldInfo.SetValue(targetObj, memberValue); } } catch (Exception ex) { Reporter.ToLog(eLogLevel.ERROR, string.Format("Error occured during object copy of the item: '{0}', type: '{1}', property/field: '{2}'", this.ItemName, this.GetType(), mi.Name), ex); } }); targetObj.PostDeserialization(); targetObj.UpdateCopiedItem(); return(targetObj); }