You could resolve those Evaluators
by using e.g. reflection.
public class AutofacTest
{
[Test]
public void Test()
{
var builder = new ContainerBuilder();
builder.RegisterType<OutageCheckEvaluator>().As<ICheckEvaluator<OutageCheck>>();
var container = builder.Build();
var listOfChecks = new List<ResourceCheck> { new OutageCheck() };
foreach (var check in listOfChecks)
{
var interfaceType = typeof(ICheckEvaluator<>).MakeGenericType(check.GetType());
var evaluator = container.Resolve(interfaceType);
Debug.WriteLine(evaluator);
}
}
}
public interface ICheckEvaluator<in TCheck> where TCheck : ResourceCheck { }
public class OutageCheckEvaluator : ICheckEvaluator<OutageCheck> { }
public class OutageCheck : ResourceCheck { }
public class ResourceCheck{}
but the problem is that since generic parameter is contravariant you cannot do any of those casts
var test = new OutageCheck() as ICheckEvaluator<ResourceCheck>;
var evaluator = container.Resolve(interfaceType) as ICheckEvaluator<ResourceCheck>;
Is there any special need you have ICheckEvaluator<in TCheck>
instead of ICheckEvaluator<out TCheck>
?