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?

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.


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

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

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"

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.


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; }
    }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.