在不知道编译时的类型的情况下解析Windsor的通用接口?

时间:2011-04-21 13:50:33

标签: c# .net reflection castle-windsor

使用Windsor,我可以这样做:

var validators = container.ResolveAll<IEntityValidator<Product>>();

但我不知道编译时的类型。我需要更像这样的代码:

var type = obj.GetType();
var validators = container.ResolveAll<IEntityValidator<...type...>>();

显然,上面的代码并不接近正确的解决方案。我猜测需要一些完美的魔法。如果与温莎完全一致的话。是吗?

3 个答案:

答案 0 :(得分:8)

这可能不完全,但它可能接近你想要做的事情:

var typeParam = obj.GetType();
var type = typeof(IEntityValidator<>).MakeGenericType(typeParam);
container.Resolve(type);

答案 1 :(得分:1)

您可以使用反射手工制作所需的类型。像这样:

var wantedGenericParam = obj.GetType();
var genericType = typeof(IEntityValidator<>).MakeGenericType(wantedGenericParam);
var allValidators = container.ResolveAll(genericType);

答案 2 :(得分:0)

简短的回答是否定的。 container.ResolveAll<IEntityValidator<Product>>()完成的操作是在编译时而不是在运行时决定的。它是在运行时执行的。