2012-03-24 39 views
29

Đừng hỏi tôi tại sao nhưng tôi cần phải làm như sau:Khởi tạo một lớp từ tên văn bản của nó

string ClassName = "SomeClassName"; 
object o = MagicallyCreateInstance("SomeClassName"); 

Tôi muốn biết có bao nhiêu cách có để làm điều này là gì và cách tiếp cận để sử dụng trong kịch bản nào.

Ví dụ:

  • Activator.CreateInstance
  • Assembly.GetExecutingAssembly.CreateInstance("")
  • Bất kỳ lời đề nghị khác sẽ được đánh giá

Câu hỏi này không có nghĩa là một cuộc thảo luận mở đã kết thúc vì tôi chắc chắn có chỉ là rất nhiều cách có thể đạt được.

+0

Bản sao có thể có của http://stackoverflow.com/questions/648160/how-do-i-create-an-instance-from-a-string-in-c –

+0

Hmm, tỷ lệ cược mà bạn có thể đoán tên không gian tên của nó một cách chính xác? Và lắp ráp nó đến từ đâu? –

+0

Lắp ráp có phải là loại đã được nạp hay không? Nếu điều này xảy ra là một cái gì đó xung quanh bổ sung, bạn có thể kiểm tra MEF –

Trả lời

40

Đây là những gì phương pháp này có thể trông giống như:

private static object MagicallyCreateInstance(string className) 
{ 
    var assembly = Assembly.GetExecutingAssembly(); 

    var type = assembly.GetTypes() 
     .First(t => t.Name == className); 

    return Activator.CreateInstance(type); 
} 

Đoạn mã trên giả định rằng:

  • bạn đang tìm kiếm một lớp học mà là trong lắp ráp hiện đang thực hiện (điều này có thể được điều chỉnh - chỉ cần thay đổi assembly thành bất kỳ thứ gì bạn cần)
  • có chính xác một lớp với tên bạn đang tìm kiếm trong hội đồng đó
  • the c lass có một constructor mặc định

Cập nhật:

Dưới đây là làm thế nào để có được tất cả các lớp học có nguồn gốc từ một lớp nhất định (và được định nghĩa trong cùng một assembly):

private static IEnumerable<Type> GetDerivedTypesFor(Type baseType) 
{ 
    var assembly = Assembly.GetExecutingAssembly(); 

    return assembly.GetTypes() 
     .Where(baseType.IsAssignableFrom) 
     .Where(t => baseType != t); 
} 
+0

Chính xác những gì tôi cần, cảm ơn. Tôi cũng cần liệt kê tất cả các lớp học lấy được lớp này mà chúng ta vừa tạo ra. Tôi giả sử 'assembly.GetTypes' sẽ cho phép điều đó. –

+1

@RaheelKhan Tôi đã thêm một mẫu mã để nhận các lớp dẫn xuất được định nghĩa trong cùng một assembly. – GolfWolf

+0

Sau khi học xong lớp, chúng ta có thể gọi phương thức bên trong không? – andrefadila

16
Activator.CreateInstance(Type.GetType("SomeNamespace.SomeClassName")); 

hoặc

Activator.CreateInstance(null, "SomeNamespace.SomeClassName").Unwrap(); 

Ngoài ra còn có quá tải, nơi bạn có thể xác định các đối số hàm tạo.

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