リフレクションを使用した拡張メソッドの識別
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 && 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; } }
この例では、GetExtensionMethods は、thisAssembly アセンブリ内の文字列型のすべての拡張メソッドを識別します。 ExtensionAttribute で修飾された型を収集し、それらのメソッドを調べて適切なパラメータ型と ExtensionAttribute を調べます。
以上がC# で拡張メソッドを識別するためにリフレクションをどのように使用できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。