특히 개인 회원에 대한 반성이 잘못되었습니다
- 반사는 타입 안전을 깨뜨립니다. 존재하지 않는 (더 이상), 잘못된 매개 변수, 너무 많은 매개 변수, 충분하지 않은 또는 불완전한 순서 (이것은 내가 가장 좋아하는 방법)를 호출하려고 시도 할 수 있습니다. 그런데 반환 유형도 변경 될 수 있습니다.
- 반사가 느립니다.
개인 멤버 리플렉션은 캡슐화 원칙을 위반 하여 코드를 다음에 노출시킵니다.
- 클래스의 내부 동작을 처리해야하므로 코드의 복잡성 이 증가 합니다. 숨겨진 것은 숨겨져 있어야합니다.
- 코드 가 컴파일 되기는 쉽지만 메소드가 이름을 변경하면 실행되지 않습니다.
- 개인 코드는 개인 코드 인 경우 그러한 방식으로 호출되지 않기 때문에 쉽게 깨뜨릴 수 있습니다. 아마도 private 메소드는 호출되기 전에 내부 상태를 기대할 수 있습니다.
어쨌든해야합니까?
타사에 의존하거나 노출되지 않은 API가 필요할 때 약간의 반영이 필요합니다. 일부는 또한 자신이 소유 한 일부 클래스를 테스트하기 위해 사용하지만 테스트를 위해 내부 멤버에 액세스하기 위해 인터페이스를 변경하고 싶지 않습니다.
네가하면 제대로 해
중단하기 쉬운 문제를 완화하기 위해 최선의 방법은 지속적인 통합 빌드 등에서 실행되는 단위 테스트에서 테스트하여 잠재적 인 중단을 감지하는 것입니다. 물론 이는 항상 동일한 멤버 (개인 멤버를 포함)를 사용한다는 것을 의미합니다. 동적로드 및 리플렉션을 사용하는 경우 화재로 플레이하는 것을 좋아하지만 항상 호출에서 발생할 수있는 예외를 잡을 수 있습니다.
최신 버전의 .Net Framework에서 CreateDelegate는 MethodInfo가 호출하는 요소 50을 이겼습니다.
// The following should be done once since this does some reflection
var method = this.GetType().GetMethod("Draw_" + itemType,
BindingFlags.NonPublic | BindingFlags.Instance);
// Here we create a Func that targets the instance of type which has the
// Draw_ItemType method
var draw = (Func<TInput, Output[]>)_method.CreateDelegate(
typeof(Func<TInput, TOutput[]>), this);
draw
다음 과 같은 표준으로 MethodInfo.Invoke
사용 draw
하는 것보다 약 50 배 빠릅니다 Func
.
var res = draw(methodParams);
다른 메소드 호출에 대한 벤치 마크를 보려면 내 게시물을 확인하십시오.