您只需將它轉換:
MyObject x = (MyObject) Activator.CreateInstance(testClasses.ElementAt(0));
當然,這是怎麼回事,如果你在testClasses
有一個類型的整個範圍更加困難。如果它們都來自相同的基類或實現相同的接口,那麼你可以轉換到該基類或接口。
編輯:
是有可能x到你傳遞到Activator.CreateInstance類型轉換不知道它是超前的時間是什麼?
只是爲了多一點解釋:X 是你要CreateInstance
通過型式的,但其鑄造成一個對象,因爲具有的CreateInstance不知道你可以扔掉它。在創建具體實例後發生問題 - 您無法將其傳遞到另一個(強類型)函數,因爲它將其作爲object
。有一對夫婦的方式解決此問題:
正如我上面提到的,讓他們都來自同一個基類或接口派生,這樣就可以通過他們周圍的基類或接口類型
,如果你有需要執行這些具體事例的動作的作用,創建一個通用的函數來做到這一點:
public T MyFunc(T myConcreteInstance)
{
... do whatever it is i need to do...
}
這是醜陋的,但它可能是難以避免...使用大如果。如果的.else聲明對他們在操作之前確定它們的類型(提示:爲了避免這種使用選項#1以上...):
Type t = myConcreteInstance.GetType();
if (t == typeof(someType1))
{
}
else if (t == typeof(someType2))
{
}
... etc ...
如果此時你在想「爲什麼不我只是做一個通用版本的CreateInstance()?「然後不要打擾 - 已經有一個,它仍然不能解決你的問題之前強制類型的東西傳遞給他們。引用MSDN:
通常,在應用程序代碼中CreateInstance沒有用處,因爲在編譯時必須知道該類型。如果類型在編譯時已知,則可以使用正常的實例化語法(C#中的新操作符,Visual Basic中的新操作符,C++中的gcnew)。
如果你要使用的CreateInstance,那是因爲你不知道類型的時間提前,因此必須解決它。
感謝您的回覆。我知道你可以打開對象並獲得類型,我只是想在對象中傳遞一些通用的方法並獲取實際的類型對象。可能不會。 – user259286 2011-04-22 01:31:20
@BrokenGlass - 我已經擴展了我的答案。 – slugster 2011-04-22 02:37:12
明白了!感謝那! – user259286 2011-04-22 02:48:05