C # Reflection: Làm thế nào để lấy tham chiếu lớp từ chuỗi?


90

Tôi muốn thực hiện việc này trong C #, nhưng tôi không biết làm thế nào:

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

FooClass.MyMethod();

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

Câu trả lời:


125

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

Đâ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 bởi vì rất dễ dàng tìm thấy một loại theo cách này nằm trong cùng một cụm. Vui lòng xem câu trả lời của Jon để được giải thích cặn kẽ hơn về những gì bạn cần biết về điều đó. Khi bạn đã truy xuất được kiểu, ví dụ của tôi sẽ chỉ cho bạn cách gọi phương thức.


101

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

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 Tuyệt vời - Tôi đã thêm một câu trả lời cho biết cách sử dụng loại sau khi bạn đã truy xuất nó. 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.
Andrew Hare

Cho rằng bạn đã được chấp nhận, tôi đề nghị chúng tôi làm điều đó theo chiều ngược lại - bạn thêm nội dung của tôi để câu trả lời của bạn, và tôi sẽ xóa cái này :)
Jon Skeet

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

10

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

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

Mẫu vật:

Type dogClass = Type.GetType("Animals.Dog, Animals");

7

Hơi trễ để trả lời nhưng điều này sẽ thực hiện thủ thuật

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

tên hội đủ điều kiện của bạn phải như thế này

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

4
Cảm ơn bạn đã giải thích rõ ràng tên đủ điều kiện của assembly sẽ trông như thế nào.
Drew

3

Thông qua Type.GetType, bạn có thể nhận được thông tin về loại. Bạn có thể sử dụng lớp này để lấy thông tin phương thức và sau đó gọi phương thức (đối với phương thức tĩnh, hãy để tham số đầu tiên là null).

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

Nếu kiểu nằm trong assembly hiện đang thực thi hoặc trong Mscorlib.dll, thì việc cung cấp tên kiểu đủ điều kiện bởi không gian tên của nó là đủ.


0

Chúng ta có thể sử dụng

Type.GetType ()

để lấy tên lớp và cũng có thể tạo đối tượng của nó bằng cách sử dụng Activator.CreateInstance(type);

using System;
using System.Reflection;

namespace MyApplication
{
    class Application
    {
        static void Main()
        {
            Type type = Type.GetType("MyApplication.Action");
            if (type == null)
            {
                throw new Exception("Type not found.");
            }
            var instance = Activator.CreateInstance(type);
            //or
            var newClass = System.Reflection.Assembly.GetAssembly(type).CreateInstance("MyApplication.Action");
        }
    }

    public class Action
    {
        public string key { get; set; }
        public string Value { get; set; }
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.