>백엔드 개발 >C++ >리플렉션을 사용하여 올바른 일반 메서드 오버로드를 안정적으로 선택하는 방법은 무엇입니까?

리플렉션을 사용하여 올바른 일반 메서드 오버로드를 안정적으로 선택하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2025-01-11 13:42:43285검색

How to Reliably Select the Correct Generic Method Overload Using Reflection?

리플렉션을 사용하여 올바른 일반 방법 선택

배경

Reflection을 사용하면 개발자가 유형 정보에 액세스하고 메서드를 동적으로 호출할 수 있습니다. 그러나 일반적인 방법을 선택할 때 오버로드를 구별하는 것이 어려울 수 있습니다. 예를 들어 System.Linq.Queryable 클래스에는 여러 Where 메서드에 대한 정의가 포함되어 있어 필요한 버전을 선택하기가 어렵습니다.

매개변수 유형에 따라 올바른 방법을 선택하세요

이 문제를 해결하려면 컴파일에 안전한 솔루션을 사용할 수 있습니다.

1. 원하는 오버로드와 일치하는 대리자 또는 표현식을 만듭니다.

대상 오버로드에 해당하는 올바른 수와 유형의 제네릭 및 메서드 매개 변수를 사용하여 대리자 또는 식을 구성합니다. 예:

<code class="language-csharp">var method = new Action<object>(MyClass.DoSomething<object>);</code>

2. 일반 MethodInfo 가져오기

대리자 또는 표현식에서 MethodInfo를 추출하고 GetGenericMethodDefinition를 사용하여 일반 메서드 정의를 가져옵니다.

<code class="language-csharp">var methodInfo = method.Method.GetGenericMethodDefinition();</code>

3. 일반 유형 매개변수 지정

실제 일반 유형 매개변수를 MakeGenericMethod에 전달하여 특정 일반 메소드를 인스턴스화합니다.

<code class="language-csharp">var typedMethod = methodInfo.MakeGenericMethod(type1, type2);</code>

Queryable.Where 오버로드를 사용한 예

오버로드가 있는 Queryable.Where 메소드의 경우:

<code class="language-csharp">public static IQueryable<TModel> Where<TModel>(this IQueryable<TModel>, Expression<Func<TModel, bool>>)

public static IQueryable<TModel> Where<TModel>(this IQueryable<TModel>, Expression<Func<TModel, int, bool>>)</code>

다음 코드는 첫 번째 버전을 선택하는 방법을 보여줍니다.

<code class="language-csharp">var method = new Func<IQueryable<object>, Expression<Func<object, bool>>, IQueryable<object>>(Queryable.Where<object>);

var methodInfo = method.Method.GetGenericMethodDefinition().MakeGenericMethod(modelType);</code>

MethodInfo와 매개변수 유형 분리

더 큰 유연성을 위해 MethodInfo를 별도로 얻고 나중에 일반 유형 매개변수를 지정할 수 있습니다. 이는 메소드를 검색할 때 유형을 알 수 없는 경우에 유용합니다.

<code class="language-csharp">var methodInfo = method.Method.GetGenericMethodDefinition();

var typedMethod = methodInfo.MakeGenericMethod(type1, type2);</code>

이러한 단계를 따르면 개발자는 여러 오버로드가 존재하더라도 컴파일 안전하고 유연한 방식으로 리플렉션을 통해 올바른 일반 메서드를 선택할 수 있습니다.

위 내용은 리플렉션을 사용하여 올바른 일반 메서드 오버로드를 안정적으로 선택하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.