2011-12-30 24 views
0

我有以下代碼:如何將具有類名稱的字符串轉換爲Generic將接受的類?

var something = UnityContainer.Resolve<IService<Package>>(); 

這工作好,因爲包是我定義和設置,並通過統一映射一類的名稱。但是在我的應用程序中,我的課程以字符串參數進入該方法。這樣的事情:

public void Update(string className) { 

var something = UnityContainer.Resolve<IService<Package>>(); 

有沒有一種方法,我可以把className字符串,並在上面的泛型使用它就像一個類?

+0

如何正確使用類名?或者你如何期待它被使用? – 2011-12-30 13:57:55

+0

我的或任何其他答案是否幫助您標記爲正確。如果您有自己的解決方案,請在此處添加。 – 2012-05-10 10:20:45

回答

0

有名爲「MakeGenericType」 Type類,與實例化方法,可以在類型傳給你要使用像下面的通用參數:

public void Update(string className) 
    { 
     var targetType = Type.GetType(className); 
     var serviceType = typeof(IService<>); 
     var genericParam = serviceType.MakeGenericType(targetType); 
     var unityType = typeof(UnityContainer); 
     var resolve = unityType.GetMethod("Resolve"); 
     var targetMethod = resolve.MakeGenericMethod(genericParam); 
     var something = targetMethod.Invoke(null, new[] { genericParam }); 
     //... 
+0

這是給我以下編譯時錯誤錯誤:錯誤沒有過載的方法'解決'需要1個參數 – 2011-12-30 15:20:52

+0

對不起,我從來沒有使用統一之前。我只是在擺動。儘管我的答案已更新爲調用泛型方法。 – doogle 2011-12-30 16:07:35

0

你可以做像

Assembly asm = Assembly.GetExecutingAssembly(); 
var t = asm.GetType("ConsoleApplication1.Test"); 

其中ConsoleApplication1是assmebly命名該測試是類的名字

2

我從來沒有使用UnityContainer,但我認爲你可以解決一個組件通過一個類型作爲參數。你可以做這樣的事情:

Type packageType = Type.GetType(className); 
Type openGenericType = typeof(IService<>); 
Type myClosedType = openGenericType.MakeGenericType(packageType); 
var something = UnityContainer.Resolve(myClosedType); 
相關問題