.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
<code class="language-c#">var methodInfo = method.Method.GetGenericMethodDefinition(); methodInfo.MakeGenericMethod(type1, type2).Invoke(null, new object[] { collection });</code>
결론
의 제한 사항을 우회하고 컴파일 타임에 올바른 일반 메서드를 선택할 수 있습니다. 이 접근 방식은 유형 안전성을 보장하고 불필요한 동적 조회를 방지합니다. GetMethod
위 내용은 리플렉션을 사용하여 .NET에서 올바른 오버로드된 일반 메서드를 선택하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!