Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Refleksi Boleh Digunakan untuk Mengenalpasti Kaedah Sambungan C#?

Bagaimanakah Refleksi Boleh Digunakan untuk Mengenalpasti Kaedah Sambungan C#?

Susan Sarandon
Lepaskan: 2025-01-06 09:01:42
asal
577 orang telah melayarinya

How Can Reflection Be Used to Identify C# Extension Methods?

Mengenal pasti Kaedah Sambungan dengan Refleksi

Dalam bidang pengaturcaraan C#, persoalan timbul: bagaimana kita boleh menggunakan refleksi untuk membezakan sama ada kaedah telah dimasukkan ke dalam kelas sebagai kaedah lanjutan? Siasatan ini berpunca daripada keperluan untuk mengesahkan bahawa kaedah sambungan tertentu telah ditambah dengan betul pada kelas semasa ujian unit. Pendekatan sedemikian amat relevan dalam situasi di mana kaedah yang sama boleh ditambahkan pada kelas itu sendiri, yang berpotensi membawa kepada pengkompil memilih versi yang terakhir.

Perjalanan Teknikal

Untuk menyelesaikan tugas ini, kita perlu menyelidiki semua perhimpunan dalam projek, di mana kaedah sambungan yang dicari mungkin berada. Objektif kami adalah untuk mencari kelas yang dihiasi dengan atribut [ExtensionAttribute] dan seterusnya memeriksa sebarang kaedah dalam kelas tersebut yang turut membawa hiasan yang sama. Langkah terakhir melibatkan meneliti jenis parameter pertama bagi setiap kaedah untuk memastikan sama ada ia sepadan dengan jenis yang kami minati.

Sekilas tentang Kod

Untuk memberikan ilustrasi yang lebih praktikal, pertimbangkan coretan kod yang disertakan, yang mensimulasikan kehadiran pelbagai jenis kaedah, termasuk sambungan dan bukan sambungan kaedah:

using System;
using System.Runtime.CompilerServices;

public static class FirstExtensions
{
    public static void Foo(this string x) { }
    public static void Bar(string x) { } // Not an extension method
    public static void Baz(this int x) { } // Not on string
}

public static class SecondExtensions
{
    public static void Quux(this string x) { }
}

class Program
{
    static void Main()
    {
        // Get the assembly containing the current type
        Assembly thisAssembly = typeof(Program).Assembly;

        // Enumerate all extension methods for the string type in the assembly
        foreach (MethodInfo method in GetExtensionMethods(thisAssembly, typeof(string)))
        {
            Console.WriteLine(method.Name);
        }
    }

    static IEnumerable<MethodInfo> GetExtensionMethods(Assembly assembly, Type extendedType)
    {
        // Determine if the extended type is a generic type definition
        var isGenericTypeDefinition = extendedType.IsGenericType && extendedType.IsTypeDefinition;

        // Query for extension methods in the assembly
        return from type in assembly.GetTypes()
               where type.IsSealed && !type.IsGenericType && !type.IsNested
               from method in type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)
               where method.IsDefined(typeof(ExtensionAttribute), false)
               where isGenericTypeDefinition
                   ? method.GetParameters()[0].ParameterType.IsGenericType && method.GetParameters()[0].ParameterType.GetGenericTypeDefinition() == extendedType
                   : method.GetParameters()[0].ParameterType == extendedType
               select method;
    }
}
Salin selepas log masuk

Apabila dilaksanakan, kod ini mengambil dan memaparkan hanya kaedah sambungan yang ditakrifkan untuk jenis rentetan dalam perhimpunan yang mengandungi kelas Program. Kaedah yang dipaparkan ialah "Foo" dan "Quux", kerana kedua-duanya memenuhi kriteria untuk kaedah sambungan.

Kesimpulannya, refleksi menyediakan mekanisme yang berharga untuk introspeksi dan mengenal pasti kaedah sambungan dalam perhimpunan. Teknik ini amat berguna untuk menguji senario, memastikan kaedah sambungan yang dimaksudkan telah berjaya dilaksanakan.

Atas ialah kandungan terperinci Bagaimanakah Refleksi Boleh Digunakan untuk Mengenalpasti Kaedah Sambungan C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan