2012-01-20 34 views
10

Tôi đang tìm cách tạo Danh sách, trong đó kiểu T là một số lớp không liên quan (với cùng các đối số hàm tạo) mà tôi biết thông qua sự phản chiếu.Tạo danh sách <> từ kiểu thời gian chạy

DataBase = new ArrayList(); 
    foreach (Type T in Types) 
    { 
     DataBase.Add(new List<T>); 
    } 

Thật không may, Visual Studio nói rằng 'Không thể tìm thấy loại hoặc không gian tên T'. Có cách nào để tôi có thể thực hiện việc này hay không hoặc chọn Danh sách để nhập T? Cảm ơn, Peter

+1

Sử dụng từ khoá 'động', có lẽ? Giả sử phiên bản đúng của .NET ... –

+1

không sử dụng 'ArrayList', trường hợp xấu nhất chỉ sử dụng' List 'nếu bạn phải – BrokenGlass

+0

@BrokenGlass, tôi có thể sẽ làm điều đó, nhưng nó không phải là ArrayList. , đó là việc tạo Danh sách có Loại thời gian chạy. – 3Pi

Trả lời

18

Bạn có thể sử dụng phản ánh:

List<object> database = new List<object>(); 
foreach (Type t in Types) 
{ 
    var listType = typeof(List<>).MakeGenericType(t); 
    database.Add(Activator.CreateInstance(listType)); 
} 
+0

Điều đó dường như đã thực hiện thủ thuật, cảm ơn bạn. – 3Pi

+3

Điều đó có hiệu quả. Nhưng việc tạo đối tượng List chỉ là một phần nhỏ của vấn đề. Anh ta cũng sẽ phải thêm các yếu tố vào nó. Và tệ hơn, tệ hơn nhiều, hãy đọc chúng. Mã đó cũng không biết loại phần tử. Một ORM được chỉ định ở đây, được cung cấp từ "cơ sở dữ liệu". –

0

Bạn đang bối rối loại và lớp System.Type cho Generic Type Parameters, đây là đoạn code để thực hiện nó theo cách bạn muốn:

var lt = typeof(List<>); 
foreach (Type T in Types) 
{ 
    var l = Activator.CreateInstance(lt.MakeGenericType(T)); 
    DataBase.Add(l); 
} 
0

Bạn có thể ... sử dụng List<object> (nếu bạn biết rằng loại của bạn là loại tham chiếu hoặc có thể chấp nhận quyền anh); hoặc create a List via reflection.

Các vấn đề liên quan