2
0
Эх сурвалжийг харах

Merge pull request #321 from EraYaN/fix-issue-320

Fixed #320 by adding an extension method to BaseItem to make a deep copy of an object.
Joshua M. Boniface 6 жил өмнө
parent
commit
9d91fa8ab8

+ 1 - 0
CONTRIBUTORS.md

@@ -4,6 +4,7 @@
  - [nvllsvm](https://github.com/nvllsvm)
  - [JustAMan](https://github.com/JustAMan)
  - [dcrdev](https://github.com/dcrdev)
+ - [EraYaN](https://github.com/EraYaN)
  - [flemse](https://github.com/flemse)
  - [bfayers](https://github.com/bfayers)
 

+ 2 - 2
Emby.Server.Implementations/Library/LibraryManager.cs

@@ -730,7 +730,7 @@ namespace Emby.Server.Implementations.Library
 
             _fileSystem.CreateDirectory(rootFolderPath);
 
-            var rootFolder = GetItemById(GetNewItemId(rootFolderPath, typeof(AggregateFolder))) as AggregateFolder ?? (AggregateFolder)ResolvePath(_fileSystem.GetDirectoryInfo(rootFolderPath));
+            var rootFolder = GetItemById(GetNewItemId(rootFolderPath, typeof(AggregateFolder))) as AggregateFolder ?? ((Folder)ResolvePath(_fileSystem.GetDirectoryInfo(rootFolderPath))).DeepCopy<Folder,AggregateFolder>();
 
             // In case program data folder was moved
             if (!string.Equals(rootFolder.Path, rootFolderPath, StringComparison.Ordinal))
@@ -799,7 +799,7 @@ namespace Emby.Server.Implementations.Library
 
                         if (tmpItem == null)
                         {
-                            tmpItem = (UserRootFolder)ResolvePath(_fileSystem.GetDirectoryInfo(userRootPath));
+                            tmpItem = ((Folder)ResolvePath(_fileSystem.GetDirectoryInfo(userRootPath))).DeepCopy<Folder,UserRootFolder>();
                         }
 
                         // In case program data folder was moved

+ 42 - 0
MediaBrowser.Controller/Entities/BaseItemExtensions.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Linq;
 using System.Collections.Generic;
 using System.Threading;
 using System.Threading.Tasks;
@@ -61,5 +62,46 @@ namespace MediaBrowser.Controller.Entities
                 item.SetImagePath(imageType, BaseItem.FileSystem.GetFileInfo(file));
             }
         }
+        
+        /// <summary>
+        /// Copies all properties on object. Skips properties that do not exist.
+        /// </summary>
+        /// <param name="source">The source object.</param>
+        /// <param name="dest">The destination object.</param>
+        public static void DeepCopy<T, TU>(this T source, TU dest) 
+        where T : BaseItem
+        where TU : BaseItem
+        {
+            var sourceProps = typeof (T).GetProperties().Where(x => x.CanRead).ToList();
+            var destProps = typeof(TU).GetProperties()
+                    .Where(x => x.CanWrite)
+                    .ToList();
+
+            foreach (var sourceProp in sourceProps)
+            {
+                if (destProps.Any(x => x.Name == sourceProp.Name))
+                {
+                    var p = destProps.First(x => x.Name == sourceProp.Name);
+                    p.SetValue(dest, sourceProp.GetValue(source, null), null);                    
+                }
+
+            }
+
+        }
+
+        /// <summary>
+        /// Copies all properties on newly created object. Skips properties that do not exist.
+        /// </summary>
+        /// <param name="source">The source object.</param>
+        public static TU DeepCopy<T, TU>(this T source) 
+        where T : BaseItem
+        where TU : BaseItem, new()
+        {
+            var dest = new TU();
+            source.DeepCopy(dest);
+            return dest;
+        }
+
+
     }
 }