58 lines
1.9 KiB
C#
Raw Normal View History

2025-09-19 19:43:49 +05:00
using System;
using System.Collections.Generic;
namespace VContainer.Internal
{
public class OpenGenericRegistrationBuilder : RegistrationBuilder
{
public OpenGenericRegistrationBuilder(Type implementationType, Lifetime lifetime)
: base(implementationType, lifetime)
{
if (!implementationType.IsGenericType || implementationType.IsConstructedGenericType)
throw new VContainerException(implementationType, "Type is not open generic type.");
}
public override Registration Build()
{
var provider = new OpenGenericInstanceProvider(ImplementationType, Lifetime, Parameters);
return new Registration(ImplementationType, Lifetime, InterfaceTypes, provider);
}
public override RegistrationBuilder AsImplementedInterfaces()
{
InterfaceTypes = InterfaceTypes ?? new List<Type>();
foreach (var i in ImplementationType.GetInterfaces())
{
if (!i.IsGenericType)
continue;
InterfaceTypes.Add(i.GetGenericTypeDefinition());
}
return this;
}
protected override void AddInterfaceType(Type interfaceType)
{
if (interfaceType.IsConstructedGenericType)
throw new VContainerException(interfaceType, "Type is not open generic type.");
foreach (var i in ImplementationType.GetInterfaces())
{
if (!i.IsGenericType || i.GetGenericTypeDefinition() != interfaceType)
continue;
if (InterfaceTypes is null)
{
InterfaceTypes = new List<Type>();
}
if (!InterfaceTypes.Contains(interfaceType))
InterfaceTypes.Add(interfaceType);
return;
}
base.AddInterfaceType(interfaceType);
}
}
}