> 백엔드 개발 > C++ > C# 확장 방법을 식별하기 위해 리플렉션을 어떻게 사용할 수 있습니까?

C# 확장 방법을 식별하기 위해 리플렉션을 어떻게 사용할 수 있습니까?

Susan Sarandon
풀어 주다: 2025-01-06 09:01:42
원래의
577명이 탐색했습니다.

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

리플렉션을 사용하여 확장 메서드 식별

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿