Skip to content

Commit

Permalink
- fix validation of open generic type registrations without parameter…
Browse files Browse the repository at this point in the history
… constraints
  • Loading branch information
SimonG96 committed Dec 19, 2024
1 parent 1b84c30 commit cc104b9
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 2 deletions.
9 changes: 7 additions & 2 deletions LightweightIocContainer.Validation/IocValidator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,13 @@ private void TryResolve(Type type, object?[]? arguments, List<Exception> validat
foreach (Type genericArgument in genericArguments.Where(g => g.IsGenericParameter))
{
Type[] genericParameterConstraints = genericArgument.GetGenericParameterConstraints();
object mock = Substitute.For(genericParameterConstraints, []);
genericParameters.Add(mock.GetType());
if (genericParameterConstraints.Any())
{
object mock = Substitute.For(genericParameterConstraints, []);
genericParameters.Add(mock.GetType());
}
else
genericParameters.Add(typeof(object));
}

type = type.MakeGenericType(genericParameters.ToArray());
Expand Down
26 changes: 26 additions & 0 deletions Test.LightweightIocContainer.Validation/IocValidatorTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,12 @@ public class Constraint : IConstraint;
[UsedImplicitly]
public class GenericTest<T> : IGenericTest<T> where T : IConstraint, new();

[UsedImplicitly]
public interface IGenericTestWithoutConstraint<T>;

[UsedImplicitly]
public class GenericTestWithoutConstraint<T> : IGenericTestWithoutConstraint<T>;

[UsedImplicitly]
public interface IGenericTestFactory
{
Expand All @@ -58,6 +64,15 @@ public GenericParameter(IGenericTest<Constraint> test)

}
}

[UsedImplicitly]
public class GenericParameterWithoutConstraint : IGenericParameter
{
public GenericParameterWithoutConstraint(IGenericTestWithoutConstraint<IParameter> test)
{

}
}

[UsedImplicitly]
private class TestViewModelDontIgnoreDesignTimeCtor : ITest
Expand Down Expand Up @@ -321,6 +336,17 @@ public void TestValidateOpenGenericTypeAsParameter()
IocValidator validator = new(iocContainer);
validator.Validate();
}

[Test]
public void TestValidateOpenGenericTypeWithoutConstraintAsParameter()
{
IocContainer iocContainer = new();
iocContainer.Register(r => r.AddOpenGenerics(typeof(IGenericTestWithoutConstraint<>), typeof(GenericTestWithoutConstraint<>)));
iocContainer.Register(r => r.Add<IGenericParameter, GenericParameterWithoutConstraint>());

IocValidator validator = new(iocContainer);
validator.Validate();
}

private void AssertNoMatchingConstructorFoundForType<T>(AggregateException aggregateException)
{
Expand Down

0 comments on commit cc104b9

Please # to comment.