diff options
| author | Joshua M. Boniface <joshua@boniface.me> | 2020-11-22 01:11:02 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-11-22 01:11:02 -0500 |
| commit | a57b99bffdf40067465a0dda920fab23ceda1451 (patch) | |
| tree | 003df6bc0da24bdddeefc8366120cb4d20fc6933 /Jellyfin.Api/Helpers/ClassMigrationHelper.cs | |
| parent | c1db8869f06105b13f93f15d12061ada523dbb78 (diff) | |
| parent | 2c9e355e428e1498d4dc3bce844917a1a0333284 (diff) | |
Merge pull request #4125 from BaronGreenback/NetworkPR2
Networking 2 (Cumulative PR) - Swapping over to new NetworkManager
Diffstat (limited to 'Jellyfin.Api/Helpers/ClassMigrationHelper.cs')
| -rw-r--r-- | Jellyfin.Api/Helpers/ClassMigrationHelper.cs | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/Jellyfin.Api/Helpers/ClassMigrationHelper.cs b/Jellyfin.Api/Helpers/ClassMigrationHelper.cs new file mode 100644 index 000000000..a911a3324 --- /dev/null +++ b/Jellyfin.Api/Helpers/ClassMigrationHelper.cs @@ -0,0 +1,71 @@ +using System; +using System.Reflection; + +namespace Jellyfin.Api.Helpers +{ + /// <summary> + /// A static class for copying matching properties from one object to another. + /// TODO: remove at the point when a fixed migration path has been decided upon. + /// </summary> + public static class ClassMigrationHelper + { + /// <summary> + /// Extension for 'Object' that copies the properties to a destination object. + /// </summary> + /// <param name="source">The source.</param> + /// <param name="destination">The destination.</param> + public static void CopyProperties(this object source, object destination) + { + // If any this null throw an exception. + if (source == null || destination == null) + { + throw new Exception("Source or/and Destination Objects are null"); + } + + // Getting the Types of the objects. + Type typeDest = destination.GetType(); + Type typeSrc = source.GetType(); + + // Iterate the Properties of the source instance and populate them from their destination counterparts. + PropertyInfo[] srcProps = typeSrc.GetProperties(); + foreach (PropertyInfo srcProp in srcProps) + { + if (!srcProp.CanRead) + { + continue; + } + + var targetProperty = typeDest.GetProperty(srcProp.Name); + if (targetProperty == null) + { + continue; + } + + if (!targetProperty.CanWrite) + { + continue; + } + + var obj = targetProperty.GetSetMethod(true); + if (obj != null && obj.IsPrivate) + { + continue; + } + + var target = targetProperty.GetSetMethod(); + if (target != null && (target.Attributes & MethodAttributes.Static) != 0) + { + continue; + } + + if (!targetProperty.PropertyType.IsAssignableFrom(srcProp.PropertyType)) + { + continue; + } + + // Passed all tests, lets set the value. + targetProperty.SetValue(destination, srcProp.GetValue(source, null), null); + } + } + } +} |
