리플렉션을 통해 적절한 일반 메서드를 선택하는 것은 어려울 수 있으며, 특히 메서드의 일반 오버로드가 여러 개 있는 경우 더욱 그렇습니다. 이 문서에서는 문자열이나 런타임 검색에 의존하지 않고 올바른 일반 메서드를 선택하는 컴파일 안전하고 효율적인 방법을 살펴봅니다.
MethodInfo.MakeGenericMethod
메서드와 함께 람다 식이나 대리자를 사용하면 컴파일 타임에 특정 일반 오버로드를 선택할 수 있습니다. 예를 들어 다음과 같은 일반 메소드가 있는 경우:
<code>public static void DoSomething<TModel>(TModel model)</code>
일반 개수와 인수 개수를 일치시키는 대리자를 만들 수 있습니다.
<code>var method = new Action<object>(MyClass.DoSomething<object>);</code>
일반 유형을 object
으로 바꾸면 런타임 파이프나 위험한 문자열 조작에 의존하지 않고도 올바른 오버로드를 선택할 수 있습니다.
정적 메서드(예: System.Linq.Queryable
클래스의 메서드)의 경우 유사한 접근 방식을 사용할 수 있습니다. 예를 들어 IQueryable<TModel>
및 Expression<Func<TModel, bool>>
을 사용하는 Where
메서드를 선택하려면 다음을 수행합니다.
<code>var method = new Func<IQueryable<object>, Expression<Func<object, bool>>, IQueryable<object>>(Queryable.Where<object>);</code>
인스턴스 메소드를 선택하려면 비슷한 패턴을 따를 수 있지만 MakeGenericMethod
을 호출하기 전에 GetGenericMethodDefinition
을 사용하여 일반 MethodInfo
을 가져옵니다.
MethodInfo
과 매개변수 유형GetGenericMethodDefinition
을 사용하여 제네릭 유형 할당에서 MethodInfo
선택을 분리하고 인스턴스화할 유형을 알고 있는 다른 메소드에 MethodInfo
를 전달하고 해당 유형으로 메소드를 호출할 수 있습니다.
이 접근 방식을 설명하기 위해 일반 메서드의 여러 오버로드가 있는 클래스를 생각해 보세요CopyList
. 다음 코드는 위 기술을 사용하여 올바른 오버로드를 선택하는 방법을 보여줍니다.
<code>var listTo = ReflectionHelper.GetIEnumerableType(fromValue.GetType()); var fn = new Func<IEnumerable<object>, Func<PropertyInfo, bool>, Dictionary<Type, Type>, IEnumerable<object>>(ModelTransform.CopyList<object>); var copyListMethod = fn.GetMethodInfo().GetGenericMethodDefinition().MakeGenericMethod(listTo); copyListMethod.Invoke(null, new object[] { fromValue, whereProps, typeMap });</code>
람다 식과 대리자의 강력한 기능을 활용하면 리플렉션을 통해 올바른 일반 메서드를 우아하게 선택하여 컴파일 시간의 안전성을 보장하고 문자열 기반 또는 런타임 검색의 함정을 피할 수 있습니다.
위 내용은 리플렉션을 사용하여 올바른 일반 메서드 오버로드를 안전하게 선택하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!