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);
        }