C # Reflection: Bagaimana cara mendapatkan referensi kelas dari string?

90

Saya ingin melakukan ini di C #, tetapi saya tidak tahu caranya:

Saya memiliki string dengan nama kelas -eg: FooClassdan saya ingin memanggil metode (statis) di kelas ini:

FooClass.MyMethod();

Jelas, saya perlu mencari referensi ke kelas melalui refleksi, tapi bagaimana caranya?

rutger
sumber

Jawaban:

125

Anda akan ingin menggunakan Type.GetTypemetode ini.

Berikut ini contoh yang sangat sederhana:

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");
    }
}

Saya katakan simple karena sangat mudah untuk menemukan type cara ini yaitu internal ke assembly yang sama. Silakan lihat jawaban Jon untuk penjelasan lebih lengkap tentang apa yang perlu Anda ketahui tentang itu. Setelah Anda mengambil jenisnya, contoh saya menunjukkan kepada Anda bagaimana menjalankan metode tersebut.

Andrew Hare
sumber
101

Anda dapat menggunakan Type.GetType(string), tetapi Anda harus mengetahui nama kelas lengkap termasuk namespace, dan jika tidak ada di assembly saat ini atau mscorlib, Anda akan memerlukan nama assembly sebagai gantinya. (Idealnya, gunakan Assembly.GetType(typeName)sebagai gantinya - saya merasa lebih mudah dalam hal mendapatkan referensi perakitan dengan benar!)

Contohnya:

// "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");
Jon Skeet
sumber
1
+1 Bagus sekali - Saya telah menambahkan jawaban yang menunjukkan bagaimana menggunakan tipe setelah Anda mengambilnya. Jika Anda mau, lanjutkan dan gabungkan contoh saya ke dalam jawaban Anda dan saya akan menghapus milik saya.
Andrew Hare
Mengingat milik Anda telah diterima, saya sarankan kami melakukannya sebaliknya - Anda menambahkan konten saya ke jawaban Anda, dan saya akan menghapus yang ini :)
Jon Skeet
4
Hanya untuk memperluas jawaban Anda lebih jauh, jika Anda tidak yakin apa yang harus diteruskan sebagai teks ke fungsi GetType dan Anda dapat mengakses kelas ini, lihat typeof (class) .AssemblyQualifiedName, ini akan memberikan gambaran yang jelas.
techExplorer
10

Penggunaan sederhana:

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

Sampel:

Type dogClass = Type.GetType("Animals.Dog, Animals");
André Voltolini
sumber
7

Agak terlambat untuk membalas tetapi ini seharusnya berhasil

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

nama kualifikasi perakitan Anda harus seperti ini

"Boom.Bam.Class, Boom.Bam, Version=1.0.0.262, Culture=neutral, PublicKeyToken=e16dba1a3c4385bd"
Atul Chaudhary
sumber
4
Terima kasih telah menjelaskan secara eksplisit seperti apa nama yang memenuhi syarat assembly itu.
Drew
3

Melalui Type.GetType Anda bisa mendapatkan informasi tipe. Anda dapat menggunakan kelas ini untuk mendapatkan informasi metode dan kemudian memanggil metode (untuk metode statis, biarkan parameter pertama kosong).

Anda mungkin juga memerlukan nama Assembly untuk mengidentifikasi jenisnya dengan benar.

Jika jenis sedang menjalankan rakitan atau di Mscorlib.dll, itu sudah cukup untuk menyediakan nama jenis yang memenuhi syarat oleh namespace-nya.

GvS
sumber
0

Kita bisa gunakan

Type.GetType ()

untuk mendapatkan nama kelas dan juga dapat membuat objeknya menggunakan 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; }
    }
}
Amol Bhor
sumber