2009-06-25 26 views
67

Tôi muốn làm điều này trong C#, nhưng tôi không biết làm thế nào:C# Phản ánh: Làm cách nào để lấy tham chiếu lớp từ chuỗi?

Tôi có một chuỗi với một tên lớp -eg: FooClass và tôi muốn gọi một phương pháp (tĩnh) trên lớp này:

FooClass.MyMethod(); 

Rõ ràng, tôi cần phải tìm một tham chiếu đến lớp thông qua phản ánh, nhưng làm cách nào?

Trả lời

92

Bạn sẽ muốn sử dụng phương pháp Type.GetType.

Dưới đây là một ví dụ rất đơn giản:

using System; 
using System.Reflection; 

class Program 
{ 
    static void Main() 
    { 
     Type t = Type.GetType("Foo"); 
     MethodInfo method 
      = t.GetMethod("Bar", BindingFlags.Static | BindingFlags.Public); 

     method.Invoke(null, null); 
    } 
} 

class Foo 
{ 
    public static void Bar() 
    { 
     Console.WriteLine("Bar"); 
    } 
} 

tôi nói đơn giản vì nó là rất dễ dàng để tìm một kiểu cách này có nghĩa là nội bộ để cùng một assembly. Vui lòng xem Jon's answer để được giải thích kỹ lưỡng hơn về những gì bạn cần biết về điều đó. Một khi bạn đã lấy ra loại ví dụ của tôi cho bạn thấy làm thế nào để gọi phương thức.

3

Via Type.GetType bạn có thể nhận thông tin loại. Bạn có thể sử dụng lớp này để thông tin get the method và sau đó invoke phương thức (đối với phương thức tĩnh, để trống tham số đầu tiên).

Bạn cũng có thể cần Assembly name để xác định chính xác loại.

Nếu loại là trong lắp ráp hiện thực hiện hoặc trong Mscorlib.dll, nó là đủ để cung cấp tên loại đủ điều kiện bởi không gian tên của nó.

73

Bạn có thể sử dụng Type.GetType(string), nhưng bạn sẽ cần phải biết tên lớp đầy đủ bao gồm không gian tên, và nếu nó không có trong lắp ráp hiện tại hoặc mscorlib bạn sẽ cần tên lắp ráp thay thế. (Lý tưởng nhất, sử dụng Assembly.GetType(typeName) thay - Tôi thấy rằng dễ dàng hơn trong việc nhận tài liệu tham khảo lắp ráp đúng!)

Ví dụ:

// "I know String is in the same assembly as Int32..." 
Type stringType = typeof(int).Assembly.GetType("System.String"); 

// "It's in the current assembly" 
Type myType = Type.GetType("MyNamespace.MyType"); 

// "It's in System.Windows.Forms.dll..." 
Type formType = Type.GetType ("System.Windows.Forms.Form, " + 
    "System.Windows.Forms, Version=2.0.0.0, Culture=neutral, " + 
    "PublicKeyToken=b77a5c561934e089"); 
+1

+1 Được thực hiện tốt - Tôi đã thêm câu trả lời hiển thị * cách * sử dụng loại sau khi bạn đã truy xuất. Nếu bạn muốn, hãy tiếp tục và kết hợp ví dụ của tôi vào câu trả lời của bạn và tôi sẽ xóa của tôi. –

+0

Vì bạn đã được chấp nhận, tôi đề nghị chúng tôi làm theo cách khác - bạn thêm nội dung vào câu trả lời của mình và tôi sẽ xóa nội dung này :) –

+4

Chỉ để mở rộng câu trả lời của bạn, nếu bạn không chắc chắn để chuyển văn bản thành hàm GetType và bạn có thể truy cập lớp này, sau đó xem typeof (lớp).AssemblyQualifiedName, điều này sẽ cho ý tưởng rõ ràng. – techExplorer

4

Bit trễ trả lời nhưng điều này nên làm các trick

Type myType = Type.GetType("AssemblyQualifiedName"); 

assembly tên đủ điều kiện nên như thế này

"Boom.Bam.Class, Boom.Bam, Version=1.0.0.262, Culture=neutral, PublicKeyToken=e16dba1a3c4385bd" 
+1

Cảm ơn bạn đã làm rõ rõ ràng tên hội đủ điều kiện sẽ trông như thế nào. – Drew

4

Một sử dụng đơn giản:

Type typeYouWant = Type.GetType("NamespaceOfType.TypeName, AssemblyName"); 

mẫu:

Type dogClass = Type.GetType("Animals.Dog, Animals"); 
Các vấn đề liên quan