Radarr/src/NzbDrone.Api/Mapping/ValueInjectorExtensions.cs

42 lines
1.5 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Omu.ValueInjecter;
namespace NzbDrone.Api.Mapping
{
public static class ValueInjectorExtensions
{
public static TTarget InjectTo<TTarget>(this object source) where TTarget : new()
{
if (source == null) return default(TTarget);
var targetType = typeof(TTarget);
if (targetType.IsGenericType &&
targetType.GetGenericTypeDefinition() != null &&
targetType.GetGenericTypeDefinition().GetInterfaces().Contains(typeof(IEnumerable)) &&
source.GetType().IsGenericType &&
source.GetType().GetGenericTypeDefinition() != null &&
source.GetType().GetGenericTypeDefinition().GetInterfaces().Contains(typeof(IEnumerable)))
{
var result = new TTarget();
var listSubType = targetType.GetGenericArguments()[0];
var listType = typeof(List<>).MakeGenericType(listSubType);
var addMethod = listType.GetMethod("Add");
foreach (var sourceItem in (IEnumerable)source)
{
var e = Activator.CreateInstance(listSubType).InjectFrom<CloneInjection>(sourceItem);
addMethod.Invoke(result, new[] { e });
}
return result;
}
return (TTarget)new TTarget().InjectFrom<CloneInjection>(source);
}
}
}