ホームページ >バックエンド開発 >C++ >C# でリフレクションを使用して拡張メソッドを識別するにはどうすればよいですか?

C# でリフレクションを使用して拡張メソッドを識別するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-06 08:52:39667ブラウズ

How Can I Identify Extension Methods Using Reflection in C#?

リフレクションを使用して拡張メソッドを識別する方法

C# では、リフレクションはコード要素をイントロスペクトするための強力なメカニズムを提供します。これには、拡張メソッドを使用してメソッドがクラスに拡張されているかどうかを識別する機能が含まれます。

メソッドが拡張メソッドとして存在するかどうかを判断する

メソッドは拡張メソッドであるため、リフレクションを使用してアセンブリのメタデータを検査できます。具体的には、

  1. ExtensionAttribute 属性で装飾されたクラスを検索できます。 この属性は、クラスに拡張メソッドが含まれていることを示します。
  2. これらのクラス内のメソッドは、 ExtensionAttribute 属性。
  3. メソッドの最初のパラメータ は、関心のある型と一致します。

コード例

次のコード スニペットは、チェック方法を示しています。リフレクションを使用した拡張メソッドの場合:

using System;
using System.Runtime.CompilerServices;
using System.Reflection;
using System.Linq;
using System.Collections.Generic;

public static class Helper
{
    public static IEnumerable<MethodInfo> GetExtensionMethods(Assembly assembly, Type extendedType)
    {
        var isGenericTypeDefinition = extendedType.IsGenericType && 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;
    }
}

このコードは、メソッドが特定のアセンブリ内の特定の型の拡張メソッドであるかどうかを確認するために使用できます。

結論

リフレクションを使用すると、メソッドが拡張メソッドとしてクラスに拡張されているかどうかを判断できます。この手法は、拡張メソッドが正しく実装されていることを確認するなど、さまざまな目的に役立ちます。

以上がC# でリフレクションを使用して拡張メソッドを識別するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。