.NET에서 여러 일반 메서드 오버로드가 있는 경우 리플렉션을 사용하여 올바른 버전을 선택하는 것이 어려울 수 있습니다. 예를 들어 System.Linq.Queryable
클래스의 정적 메서드에는 Where
메서드에 대한 두 가지 정의가 있습니다.
<code class="language-c#">static IQueryable<T> Where(this IQueryable<T> source, Expression<Func<T, bool>> predicate) static IQueryable<T> Where(this IQueryable<T> source, Expression<Func<T, bool>> predicate)</code>리플렉션의
메서드는 이러한 오버로드를 구별할 수 없기 때문에 이 작업에 충분하지 않습니다. GetMethod
또는 Action
대리자를 생성하여 컴파일 타임에 메서드를 선택할 수 있습니다. Func
예 1: 일반 유형과 단일 매개변수를 사용하는 메서드 선택: Where
<code class="language-c#">var method = new Action<object>(MyClass.DoSomething<object>);</code>
예 2: 두 개의 일반 유형과 두 개의 매개변수를 사용하는 메서드 선택: Where
<code class="language-c#">var method = new Action<object, object>(MyClass.DoSomething<object, object>);</code>이 접근 방식을 사용하면 위험한 문자열이나 런타임 검색에 의존하지 않고도 필요한 방법을 얻을 수 있습니다.
MethodInfo 개체 가져오기
개체가 필요한 경우 대리자를 생성한 후 얻을 수 있습니다. MethodInfo
<code class="language-c#">var methodInfo = method.Method.MakeGenericMethod(type1, type2);</code>정적 확장 방법
<code class="language-c#">var method = new Func<IQueryable<object>, Expression<Func<object, bool>>, IQueryable<object>>(Queryable.Where<object>); var methodInfo = method.Method.MakeGenericMethod(modelType);</code>MethodInfo와 매개변수 유형 분리
개체와 매개변수 유형을 분리해야 할 수도 있습니다. MethodInfo
<code class="language-c#">var methodInfo = method.Method.GetGenericMethodDefinition(); methodInfo.MakeGenericMethod(type1, type2).Invoke(null, new object[] { collection });</code>이 기술을 사용하면 클래스에서 인스턴스 메서드를 선택하고 이를 다양한 유형에 사용하기 위해 노출하는 등 복잡한 작업을 수행할 수 있습니다.
결론
의 제한 사항을 우회하고 컴파일 타임에 올바른 일반 메서드를 선택할 수 있습니다. 이 접근 방식은 유형 안전성을 보장하고 불필요한 동적 조회를 방지합니다. GetMethod
위 내용은 리플렉션을 사용하여 .NET에서 올바른 오버로드된 일반 메서드를 선택하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!