2013-10-24 13 views
-1

不要問我爲什麼類的列表,但我需要做到以下幾點:
string cName = "ClassA";
List<cName> l = new List<cName>();
我該怎麼辦呢?如何創建的,其中的類名是從字符串採取在C#

我的代碼:
public void MergeForm(List<object> lModel)
{
string className = lModel[0].GetType().Name;
List<className> list = new List<className>();
}
對象 - 這是一類

+0

可能的重複數據刪除:http://stackoverflow.com/questions/1044455/c-sharp-reflection-how-to-get-class-reference-from-string – Saturnix

+3

我不喜歡「不要問我爲什麼」。如果我們知道爲什麼,我們可以提供更好的解決方案。在軟件開發方面,羅馬人往往不止一條路。 – Marco

+1

你爲什麼想這樣做? :) – Kjartan

回答

3

使用Assemmbly.GetTypes

var l = Assembly.GetTypes().Where(t => t.Name == "ClassA").ToList(); 

如果您有充分的類型名稱,你可以使用Assemmbly.GetType

如果您有完整的類型名稱和裝配限定名稱,並且您尋求的類型位於另一裝配中,請使用Type.GetType

+0

感謝您的回答,但它的拋出異常:非靜態字段,方法或屬性'System.Reflection.Assembly.GetTypes() – Sultan

+0

@Sultan需要對象引用很難猜測。也許顯示更多你的代碼。另外,我描述的方法是非常常用的,在找到一些例子時(從我提供的鏈接開始),你不應該有任何問題。 – BartoszKP

3

你不能有List<cName>爲靜態類型,但你可以創建實例:

IList l = (IList)Activator 
    .CreateInstance(typeof(List<>) 
    .MakeGenericType(Type.GetType(cName))); 

cName必須是完全合格的名字,雖然。

0
Type ac; 
string cName = "ClassA"; 
switch (cName) 
{ 
case "ClassA": 
ac = typeof(ClassA); 
break; 
case "ClassB": 
ac = typeof(ClassB); 
break; 
default: 
ac = typeof(System.String);  
break; 
} 
var genericListType = typeof(List<>); 
var specificListType = genericListType.MakeGenericType(ac); 
var l= Activator.CreateInstance(specificListType); 
+0

我無法使用開關,因爲我有很多課程 – Sultan

相關問題