2013-10-02 39 views
2

我要創建一個列表創建類的列表,但我只知道類名從一個類名

public void getList(string className) 
{ 

IList lsPersons = (IList)Activator.CreateInstance(
     typeof(List<>).MakeGenericType(Type.GetType(className)))); 

} 

我試過很多方法,但沒有爲我工作。

+0

究竟你有什麼問題? –

+2

「不起作用」不是一個有效的描述。當它「不起作用」時,我們無法幫助您。告訴我們你的嘗試和失敗。與特定的錯誤信息。 – nvoigt

+0

你應該提一下你爲'className'使用的值。 –

回答

1

您可以創建一個通用列表,但它沒有用。如果你想擁有一個通用的List<T>,你應該在其中某個地方加入你對於所需類型的先前知識。例如,你可以做這樣的事情:

if(className == "Employee") // this is where your prior knowledge is playing role 
{ 
    IList<Employee> lsPersons = (IList<Employee>)Activator.CreateInstance(
      typeof(List<Employee>).MakeGenericType(Type.GetType(className)))); 
} 

此外,您還可以通過這樣的事情做出任何類型的泛型列表:

public static class GenericListBuilder 
{ 
    public static object Build(Type type) 
    { 
     var obj = typeof(GenericListBuilder) 
       .GetMethod("MakeGenList", BindingFlags.Static|BindingFlags.NonPublic) 
       .MakeGenericMethod(new Type[] { type }) 
       .Invoke(null, (new object[] {})); 
     return obj; 
    } 

    private static List<T> MakeGenList<T>() 
    { 
     return new List<T>(); 
    } 
} 

,則有可能去消費,如:

var List<Employee> = GenericListBuilder.Build(typeof(Employee)) as List<Employee>; 

IList list = GenericListBuilder.Build(Type.GetType(className)) as IList; 

最後一行完全是盲目的,我認爲它非常接近你的想法。但它有什麼好處?我不認爲。