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

Bagaimanakah Refleksi Boleh Digunakan untuk Mengenalpasti Kaedah Sambungan dalam C#?

Linda Hamilton
Lepaskan: 2025-01-06 08:57:40
asal
324 orang telah melayarinya

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

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 &amp;&amp; extendedType.IsTypeDefinition;
        var query = from type in assembly.GetTypes()
            where type.IsSealed &amp;&amp; !type.IsGenericType &amp;&amp; !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 &amp;&amp; method.GetParameters()[0].ParameterType.GetGenericTypeDefinition() == extendedType
                : method.GetParameters()[0].ParameterType == extendedType
            select method;
        return query;
    }
}
Salin selepas log masuk

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!

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