2009-03-03 32 views
6

Cách tốt nhất để chuyển đổi chuỗi thành đối tượng Kiểu trong .NET là gì?Cách tốt nhất để lấy đối tượng Kiểu từ một chuỗi trong .NET

vấn đề cần xem xét:

  • Các loại có thể nằm trong một hội đồng khác nhau.
  • Cụm của loại có thể chưa được tải.

Đây là nỗ lực của tôi, nhưng nó không giải quyết vấn đề thứ hai

Public Function FindType(ByVal name As String) As Type 
    Dim base As Type 

    base = Reflection.Assembly.GetEntryAssembly.GetType(name, False, True) 
    If base IsNot Nothing Then Return base 

    base = Reflection.Assembly.GetExecutingAssembly.GetType(name, False, True) 
    If base IsNot Nothing Then Return base 

    For Each assembly As Reflection.Assembly In _ 
     AppDomain.CurrentDomain.GetAssemblies 
     base = assembly.GetType(name, False, True) 
     If base IsNot Nothing Then Return base 
    Next 
    Return Nothing 
End Function 
+0

Phát biểu tại trường hợp thứ hai là khó khăn. Làm thế nào để biết một cách tổng quát nơi mà các hội đồng không tải được cư trú? Nếu không, hãy xem [câu trả lời này] (http://stackoverflow.com/a/7286354/661933), khá tốt. – nawfal

Trả lời

3

bạn có thể cần phải gọi phương thức GetReferencedAssemblies() cho phương thức thứ hai.

namespace reflectme 
{ 
    using System; 
    public class hello 
    { 
     public hello() 
     { 
      Console.WriteLine("hello"); 
      Console.ReadLine(); 
     } 
     static void Main(string[] args) 
     { 
      Type t = System.Reflection.Assembly.GetExecutingAssembly().GetType("reflectme.hello"); 
      t.GetConstructor(System.Type.EmptyTypes).Invoke(null); 
     } 
    } 
} 
9

Bạn có thể sử dụng Type.GetType(string) để làm điều này. Tên loại phải được lắp ráp đủ điều kiện nhưng phương pháp sẽ tải lắp ráp khi cần thiết. Trình độ hội đủ điều kiện là không cần thiết nếu kiểu nằm trong mscorlid hoặc assembly thực hiện cuộc gọi GetType.

+0

Lưu ý rằng điều này không ném một ngoại lệ nếu loại không được tìm thấy, nó trả về null. Nếu bạn đang mong đợi kiểu tồn tại thì nó có giá trị bằng cách sử dụng quá tải Type.GetType (string, bool) và truyền đi true, mà ném nếu loại không thể được nạp. –

+0

"assembly đủ điều kiện" nghĩa là bạn phải đặt tên kiểu FULL, như sau: "NLog, Version = 1.0.0.505, Culture = neutral, PublicKeyToken = 5120e14c03d0593c, processorArchitecture = MSIL" –

+0

Điều đó không giúp ích gì cho tôi, không có cơ hội của tôi có tên đầy đủ. –

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