mirror of
https://github.com/AlexMacocian/Slim.git
synced 2026-07-18 00:29:50 +00:00
40 lines
1.2 KiB
C#
40 lines
1.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using Slim.Resolvers;
|
|
|
|
namespace Slim.Integration.ServiceCollection;
|
|
|
|
internal sealed class IEnumerableResolver : IDependencyResolver
|
|
{
|
|
private static readonly Type EnumerableType = typeof(IEnumerable<>);
|
|
|
|
public bool CanResolve(Type type)
|
|
{
|
|
if (type.IsGenericType && type.GetGenericTypeDefinition() == EnumerableType)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public object Resolve(IServiceProvider serviceProvider, Type type)
|
|
{
|
|
var genericArgumentType = type.GetGenericArguments().FirstOrDefault();
|
|
if (genericArgumentType is null)
|
|
{
|
|
throw new InvalidOperationException($"Unable to resolve {type.Name}");
|
|
}
|
|
|
|
var list = serviceProvider.GetServicesOfType(genericArgumentType).ToArray();
|
|
|
|
// Dynamically invoke IEnumerable.Cast to create an IEnumerable<type>
|
|
var enumerable = typeof(Enumerable)
|
|
.GetMethod("Cast", new[] { typeof(System.Collections.IEnumerable) })
|
|
.MakeGenericMethod(genericArgumentType)
|
|
.Invoke(null, new object[] { list });
|
|
return enumerable;
|
|
}
|
|
}
|