Menggunakan Refleksi untuk Mengenalpasti Kaedah Sambungan
Dalam C#, kaedah sambungan menyediakan cara yang mudah untuk menambah fungsi baharu kepada jenis sedia ada tanpa mengubah suai yang asal definisi kelas. Menentukan sama ada kaedah sambungan telah ditambahkan pada kelas boleh berguna dalam pelbagai senario, seperti ujian unit atau memastikan pelaksanaan yang betul.
Untuk mengenal pasti kaedah sambungan menggunakan refleksi, anda mesti melihat dalam himpunan tempat sambungan kaedah boleh ditakrifkan. Kenal pasti kelas yang dihiasi dengan atribut ExtensionAttribute dan periksa kaedah dalam kelas tersebut. Mana-mana kaedah yang ditandakan dengan ExtensionAttribute dan jenis parameter pertamanya sepadan dengan jenis yang anda siasat ialah kaedah sambungan.
using System; using System.Runtime.CompilerServices; using System.Reflection; using System.Linq; using System.Collections.Generic; public static class FirstExtensions { public static void Foo(this string x) { } public static void Bar(string x) { } // Not an ext. method public static void Baz(this int x) { } // Not on string } public static class SecondExtensions { public static void Quux(this string x) { } } public class Test { static void Main() { Assembly thisAssembly = typeof(Test).Assembly; foreach (MethodInfo method in GetExtensionMethods(thisAssembly, typeof(string))) { Console.WriteLine(method); } } static IEnumerable<MethodInfo> GetExtensionMethods(Assembly assembly, Type extendedType) { var isGenericTypeDefinition = extendedType.IsGenericType && extendedType.IsTypeDefinition; var query = 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; return query; } }
Dalam contoh ini, GetExtensionMethods mengenal pasti semua kaedah sambungan untuk jenis rentetan dalam perhimpunan thisAssembly. Ia mengumpulkan jenis yang dihiasi dengan ExtensionAttribute dan memeriksa kaedah mereka untuk jenis parameter yang sesuai dan ExtensionAttribute.
Atas ialah kandungan terperinci Bagaimanakah Refleksi Boleh Digunakan untuk Mengenalpasti Kaedah Sambungan dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!