Ну, вот как я "решил" это ... хотя я все еще думаю, что это возможно, либо я не понял свою собственную проблему, либо пытаюсь сделать что-то глупое.
private static IEnumerable<object> ResolveTypeHierarchy(Type type, Type msgType) {
var handlers = new List<object>();
foreach (var interfaceType in msgType.GetInterfaces()) {
var gType = type.MakeGenericType(interfaceType);
handlers.AddRange(container.ResolveAll(gType));
}
var baseType = msgType;
while (null != baseType) {
var gType = type.MakeGenericType(baseType);
handlers.AddRange(container.ResolveAll(gType));
baseType = baseType.BaseType;
}
return handlers;
}
ResolveTypeHierarchy(typeof(IFoo<>), typeof(BarImpl));
=> { FooImplA, FooImplB }
Я, вероятно, должен отметить, что это было взято из исследования и пиринга через код Rhino.ServiceBus.