2009-01-29 167 views
32

我有一個字符串變量,表示自定義類的名稱。例如:將字符串轉換爲類名稱

string s = "Customer"; 

我需要創建客戶的數組列表。所以,需要的語法是:

List<Customer> cust = new .. 

如何將字符串s轉換爲能夠在運行時創建此數組列表?

+0

John,.NET框架中沒有ArrayList類的通用實現。 Bob,這個問題已經超出了範圍,但是如果你使用C#2.0+進行編程,你應該用ArrayList替代通用的東西。 – senfo 2009-01-29 23:12:47

回答

55

那麼,對於一件事ArrayList是不是通用的......你的意思是List<Customer>

您可以使用Type.GetType(string)通過名稱獲取與類型關聯的對象Type。如果程序集不是mscorlib或當前正在執行的類型,則需要包含程序集名稱。無論哪種方式,你也需要命名空間。

你確定你確實需要泛型類型嗎?泛型通常提供編譯時間類型安全性,如果在執行時發現類型,顯然你不會有太多的東西。您可以發現它很有用,但...

Type elementType = Type.GetType("Customer"); 
Type listType = typeof(List<>).MakeGenericType(new Type[] { elementType }); 

object list = Activator.CreateInstance(listType); 

如果你需要做任何與列表中,你可能需要做更多的普通反射,但...例如調用通用方法。

+0

如何將對象轉換爲具體類型?我試過使用List concreteType,但這不起作用? – KingOfHypocrites 2012-04-04 14:04:19

10

這是一個反思問題。你需要找到的類型,然後實例化它的一個實例,是這樣的:

Type hai = Type.GetType(classString,true); 
Object o = (Activator.CreateInstance(hai)); //Or you could cast here if you already knew the type somehow 

,或者的CreateInstance(的AssemblyName,類名)

您將需要雖然注意命名空間/類型的衝突,但這將爲一個簡單的場景做訣竅。

另外,在try/catch中包裝! Activator.CreateInstance是可怕的!