2011-04-21 36 views
3

隨着溫莎,我可以做到這一點:解決與Windsor的通用接口而不知道編譯時的類型?

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

但我不知道在編譯類型。我需要的代碼更像這樣:

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

很明顯,上面的代碼並不靠近正確的解決方案。我猜想有一些需要的重複魔法。如果它完全有可能與溫莎。是嗎?

回答

8

這可能不是很完整,但它可能接近你想要做什麼:

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

這可能與我所能得到的相近。與'validator.GetType()。GetMethod(「Validate」)一起。調用(validator,new [] {obj});'它工作正常。但由於我必須使用反射來調用方法,而且我沒有很強的輸入,所以我可能會換個方式。但是,謝謝! – Allrameest 2011-04-21 15:34:03

0

簡短的回答是否定的。 container.ResolveAll<IEntityValidator<Product>>()所做的是在編譯時決定的,而不是在運行時決定的。這是在運行時發生的執行。

+0

它是不可能的強類型,但可能以非強類型的方式。 – 2011-04-21 14:33:08

1

您可以手工工藝你想使用反射類型。像這樣:

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