2009-09-23 124 views
1

我得到一個使用TypeAssembly類,如下所示:如何從動態加載類型創建通用對象?

var asm = Assembly.GetAssembly(typeof(MyAssembly)); 
var t=asm.GetType("FULLY QUALIFIED CLASS NAME", true, true); 

然後,我從這種類型的創建對象:

var obj = Activator.CreateObject(t, new []{ params }); 

現在我想轉換或施放此對象到Generic對象(實際上是SubSonic Active Record Object)。

var record = (ActiveRecord<PUT SOMEHOW TYPE t HERE>)obj; 

我該如何做到這一點?

+0

難道你們就不能只是做完全合格的類名是ActiveRecord ,而不只是部分? – 2009-09-23 07:38:56

+1

我不認爲這是可能的。 Casting告訴編譯器你(開發者)*知道*類型是什麼,但你不知道這裏。 – 2009-09-23 07:52:33

回答

3

靜態打字的一點是,你知道在編譯時的類型。

你認爲record變量的類型是什麼?編譯器需要知道 - 它不能等到執行時間。

無論如何你想用record做什麼?如果真正的目標是創建一個ActiveRecord<T>對象,但您不需要知道T用於任何其他操作,那麼您需要使用反射Type.MakeGenericTypeMethodInfo.MakeGenericMethod,具體取決於ActiveRecord API(我不熟悉它)...但是你無法在後面的代碼行中以靜態類型的方式(取決於T)使用結果。

ActiveRecord<T>是否實現非通用接口?如果是這樣,那麼在構建相關實例之後,通常會使用這種方法。

如果你能提供一個鏈接到ActiveRecord<T>文檔,以瞭解如何構建一個實例,我很高興爲你寫的反射代碼...

0

你的類必須繼承ActiveRecord,或者本身是ActiveRecord。

你想投一個類型到另一個物體receving的fomer爲varible:

Cat c = new Cat(); 
List<Cat> l = (List<Cat>) c; // error.