Reflection을 사용하면 개발자가 유형 정보에 액세스하고 메서드를 동적으로 호출할 수 있습니다. 그러나 일반적인 방법을 선택할 때 오버로드를 구별하는 것이 어려울 수 있습니다. 예를 들어 System.Linq.Queryable
클래스에는 여러 Where
메서드에 대한 정의가 포함되어 있어 필요한 버전을 선택하기가 어렵습니다.
이 문제를 해결하려면 컴파일에 안전한 솔루션을 사용할 수 있습니다.
대상 오버로드에 해당하는 올바른 수와 유형의 제네릭 및 메서드 매개 변수를 사용하여 대리자 또는 식을 구성합니다. 예:
<code class="language-csharp">var method = new Action<object>(MyClass.DoSomething<object>);</code>
대리자 또는 표현식에서 MethodInfo
를 추출하고 GetGenericMethodDefinition
를 사용하여 일반 메서드 정의를 가져옵니다.
<code class="language-csharp">var methodInfo = method.Method.GetGenericMethodDefinition();</code>
실제 일반 유형 매개변수를 MakeGenericMethod
에 전달하여 특정 일반 메소드를 인스턴스화합니다.
<code class="language-csharp">var typedMethod = methodInfo.MakeGenericMethod(type1, type2);</code>
오버로드가 있는 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
를 별도로 얻고 나중에 일반 유형 매개변수를 지정할 수 있습니다. 이는 메소드를 검색할 때 유형을 알 수 없는 경우에 유용합니다.
<code class="language-csharp">var methodInfo = method.Method.GetGenericMethodDefinition(); var typedMethod = methodInfo.MakeGenericMethod(type1, type2);</code>
이러한 단계를 따르면 개발자는 여러 오버로드가 존재하더라도 컴파일 안전하고 유연한 방식으로 리플렉션을 통해 올바른 일반 메서드를 선택할 수 있습니다.
위 내용은 리플렉션을 사용하여 올바른 일반 메서드 오버로드를 안정적으로 선택하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!