리플렉션을 사용하여 일반적인 방법 선택
Reflection을 사용하면 특정 제네릭 유형 매개변수를 사용하여 메서드를 호출할 수 있지만 여러 제네릭 오버로드가 있는 경우 적절한 메서드를 선택하는 것이 어려울 수 있습니다. 이 문서에서는 대리자 및 메서드 정보 개체를 조작하여 대상 일반 메서드를 정확하게 선택하는 컴파일 타임 접근 방식을 보여줍니다.
대리인 선택 방법 사용
정적 메서드의 경우 필요한 수의 제네릭 및 매개 변수가 포함된 대리자를 생성하면 특정 오버로드를 선택할 수 있습니다. 예를 들어 DoSomething<TModel>
의 첫 번째 오버로드를 선택하려면 일반 매개변수
<code class="language-C#">var method = new Action<object>(MyClass.DoSomething<object>);</code>
또는 두 개의 일반 매개변수가 있는 두 번째 오버로드:
<code class="language-C#">var method = new Action<object, object>(MyClass.DoSomething<object, object>);</code>
정적 확장 메서드의 경우 this
매개변수를 처리하기 위해 적절한 유형을 사용하여 유사한 패턴을 따릅니다.
<code class="language-C#">var method = new Func<IQueryable<object>, Expression<Func<bool>>, IQueryable<object>>(Queryable.Where<object>);</code>
메소드 정보 가져오기
대리자의 Method
속성은 기본 MethodInfo
객체를 제공합니다. 일반 메소드 정의를 얻고 특정 유형 매개변수를 제공하려면:
<code class="language-C#">var methodInfo = method.Method.MakeGenericMethod(type1, type2);</code>
인스턴스 메소드
인스턴스 방법을 선택하는 과정은 비슷합니다.
<code class="language-C#">var method = new Action<object>(instance.MyMethod<object>); var methodInfo = method.Method.GetGenericMethodDefinition().MakeGenericMethod(type1);</code>
디커플링 방법 선택 및 매개변수 유형
일반 유형 매개변수가 나중까지 결정되지 않은 경우:
<code class="language-C#">var methodInfo = method.Method.GetGenericMethodDefinition();</code>
나중에 원하는 유형을 MakeGenericMethod()
에 전달합니다.
<code class="language-C#">methodInfo.MakeGenericMethod(type1, type2);</code>
결론
이 접근 방식을 사용하면 오류가 발생하기 쉬운 런타임 검색이나 문자열 사용을 방지하여 컴파일 타임에 일반 메서드를 정확하게 선택할 수 있습니다. 다양한 유형 매개변수를 사용하여 일반 메소드를 호출하기 위한 강력하고 유연한 메커니즘을 제공합니다.
위 내용은 컴파일 타임에 리플렉션을 사용하여 일반 메서드를 정확하게 선택하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!