首頁 > 後端開發 > C++ > 如何使用反射來識別 C# 中的擴展方法?

如何使用反射來識別 C# 中的擴展方法?

Linda Hamilton
發布: 2025-01-06 08:57:40
原創
324 人瀏覽過

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

使用反射來識別擴展方法

在C# 中,擴展方法提供了一種便捷的方法,可以在不修改原始類型的情況下為現有類型新增功能類別定義。確定擴展方法是否已添加到類別中在各種場景中都很有用,例如單元測試或確保正確實現。

要使用反射辨識擴充方法,必須先查看擴充所在的組件可以定義方法。識別用 ExtensionAttribute 屬性修飾的類別並檢查這些類別中的方法。任何以 ExtensionAttribute 標記且其第一個參數類型與您正在研究的類型相符的方法都是擴充方法。

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;
    }
}
登入後複製

在此範例中,GetExtensionMethods 識別 thisAssembly 程式集中字串類型的所有擴充方法。它收集用 ExtensionAttribute 修飾的類型,並檢查其方法是否有適當的參數類型和 ExtensionAttribute。

以上是如何使用反射來識別 C# 中的擴展方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板