2009-01-29 44 views
32

Tôi có một biến chuỗi đại diện cho tên của một lớp tùy chỉnh. Ví dụ:Chuyển đổi một chuỗi thành tên lớp

string s = "Customer"; 

Tôi sẽ cần tạo danh sách các khách hàng. Vì vậy, cú pháp cần thiết là:

List<Customer> cust = new .. 

Làm cách nào để chuyển đổi chuỗi để có thể tạo danh sách mảng này khi chạy?

+0

John, không có triển khai chung cho lớp ArrayList trong khuôn khổ .NET. Bob, đây là phạm vi cho câu hỏi, nhưng nếu bạn đang lập trình trong C# 2.0+, bạn nên thay thế ArrayList cho một cái gì đó chung chung. – senfo

Trả lời

55

Vâng, với một điều ArrayList không phải là chung chung ... ý của bạn là List<Customer>?

Bạn có thể sử dụng Type.GetType(string) để nhận đối tượng Type được liên kết với loại theo tên của nó. Nếu assembly không phải là mscorlib hoặc kiểu hiện đang thi hành, bạn sẽ cần phải bao gồm tên assembly. Dù bằng cách nào bạn cũng sẽ cần không gian tên.

Bạn có chắc chắn bạn thực sự cần loại chung không? Generics chủ yếu cung cấp biên dịch thời gian loại an toàn, rõ ràng bạn sẽ không có nhiều nếu bạn đang tìm kiếm loại tại thời gian thực hiện. Bạn thể thấy nó hữu ích mặc dù ...

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

object list = Activator.CreateInstance(listType); 

Nếu bạn cần làm bất cứ điều gì với danh sách đó, bạn có thể cũng cần phải làm phản ánh chung chung hơn mặc dù ... ví dụ để gọi một phương pháp chung.

+0

Làm cách nào để bạn chuyển đối tượng sang loại bê tông? Tôi đã thử sử dụng List concreteType nhưng điều này không hoạt động? – KingOfHypocrites

+0

@KingOfHypocrites: Kiểu của đối tượng * là * đúng loại. Loại * biến * không thể được, bởi vì bạn không biết rằng tại thời gian biên dịch. –

+0

@JonSkeet Tôi đã tìm kiếm và tìm kiếm. Có cách nào để làm điều này khi gọi một phương pháp chung? Nói cách khác, thay vì cần phải điền một đối tượng 'List ', nếu bạn cần gọi phương thức 'MyMethod ()' thì sao? – RLH

10

Đây là câu hỏi phản ánh. Bạn cần phải tìm loại sau đó nhanh chóng một thể hiện của nó, một cái gì đó như thế này:

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

hay, CreateInstance (AssemblyName, className)

Bạn sẽ cần phải xem ra cho không gian tên/loại xung đột mặc dù, nhưng sẽ thực hiện thủ thuật cho một kịch bản đơn giản.

Ngoài ra, hãy bọc trong thử/nắm bắt! Activator.CreateInstance thật đáng sợ!

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