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; } }
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!