ホームページ > バックエンド開発 > C++ > C# で拡張メソッドを識別するためにリフレクションをどのように使用できますか?

C# で拡張メソッドを識別するためにリフレクションをどのように使用できますか?

Linda Hamilton
リリース: 2025-01-06 08:57:40
オリジナル
358 人が閲覧しました

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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート