리플렉션을 사용하여 확장 메서드 식별
C# 프로그래밍 영역에서는 다음과 같은 질문이 제기됩니다. 확장 방법으로 클래스에 통합되었습니까? 이 문의는 단위 테스트 중에 특정 확장 메서드가 클래스에 제대로 추가되었는지 확인해야 할 필요성에서 비롯됩니다. 이러한 접근 방식은 동일한 메서드가 클래스 자체에 추가되어 잠재적으로 컴파일러가 후자 버전을 선택하게 될 수 있는 상황에 특히 적합합니다.
기술 여정
이 작업을 수행하려면 원하는 확장 방법이 있을 수 있는 프로젝트 내의 모든 어셈블리를 조사해야 합니다. 우리의 목표는 [ExtensionAttribute] 특성으로 장식된 클래스를 찾은 다음 동일한 장식을 전달하는 해당 클래스 내의 모든 메서드를 검사하는 것입니다. 마지막 단계에서는 각 메소드의 첫 번째 매개변수 유형을 자세히 조사하여 관심 있는 유형에 해당하는지 확인합니다.
코드 살펴보기
보다 실용적인 설명을 제공하려면 확장 및 비확장을 포함하여 다양한 유형의 메소드 존재를 시뮬레이션하는 함께 제공되는 코드 조각을 고려하십시오. 메서드:
using System; using System.Runtime.CompilerServices; public static class FirstExtensions { public static void Foo(this string x) { } public static void Bar(string x) { } // Not an extension method public static void Baz(this int x) { } // Not on string } public static class SecondExtensions { public static void Quux(this string x) { } } class Program { static void Main() { // Get the assembly containing the current type Assembly thisAssembly = typeof(Program).Assembly; // Enumerate all extension methods for the string type in the assembly foreach (MethodInfo method in GetExtensionMethods(thisAssembly, typeof(string))) { Console.WriteLine(method.Name); } } static IEnumerable<MethodInfo> GetExtensionMethods(Assembly assembly, Type extendedType) { // Determine if the extended type is a generic type definition var isGenericTypeDefinition = extendedType.IsGenericType && extendedType.IsTypeDefinition; // Query for extension methods in the assembly return 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; } }
이 코드가 실행되면 Program 클래스가 포함된 어셈블리의 문자열 유형에 대해 정의된 확장 메서드만 검색하고 표시합니다. 표시되는 메서드는 "Foo" 및 "Quux"입니다. 둘 다 확장 메서드 기준을 충족하기 때문입니다.
결론적으로 리플렉션은 어셈블리 내에서 확장 메서드를 검사하고 식별하는 데 유용한 메커니즘을 제공합니다. 이 기술은 시나리오를 테스트하여 의도한 확장 방법이 성공적으로 구현되었는지 확인하는 데 특히 유용할 수 있습니다.
위 내용은 C# 확장 방법을 식별하기 위해 리플렉션을 어떻게 사용할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!